nullptr 和 boolean 之间的比较
comparison between nullptr and boolean
在尝试使用空指针时,我尝试编写代码来检查指针是否为空:
#include <iostream>
using namespace std ;
int main(){
int *p = 0;
if(!p == true){
cout<<"nullptr\n";
}
else{
cout<< "no\n";
}
return 0;
}
工作正常,没有任何错误,但是当我尝试这个时(根据我的说法,这基本上是同一件事,但显然不是):
#include <iostream>
using namespace std ;
int main(){
int *p = 0;
if(p == false){
cout<<"nullptr\n";
}
else{
cout<< "no\n";
}
return 0;
}
我收到一个错误:“错误:ISO C++ 禁止比较指针和
整数 [-fpermissive]"
谁能告诉我这两个代码有何不同,为什么第二个代码会出错?
当您对指针 p
执行 !
时,您会得到 true
或 false
值,具体取决于 p
是否为 [=15] =] 或不。显然,比较2个bool
就可以了。
当你做p == true
时,左边仍然是一个指针,你不能比较指针和bool
s。
这与隐式和显式转换的区别,以及bool
类型的特殊状态有关关于显式转换。
通常,虽然您可以在整数和指针(任一方向)之间进行转换,但您只能显式 进行强制转换。没有转换意味着没有转换,你会得到一个错误。
这里的特殊例外来自bool
类型的特殊处理和"boolean contexts"的特殊状态。基本上,有一些句法上下文:
if
、while
或 for
语句的条件表达式操作数
!
一元运算符的操作数
?
/:
三元运算符的第一个操作数
&&
/||
的操作数
是 "boolean contexts" -- 操作数必须是布尔值 -- 并且其他类型的操作数可以隐式转换为 bool
即使此类转换通常需要显式转换
这说明了为什么您的第一个示例有效——您使用的是一元 !
,它是允许转换为 bool 的特殊布尔上下文之一,就好像存在显式强制转换一样。
这与指针没有什么特别的关系——同样的事情发生在任何用户定义的 (class) 类型上,该类型具有为其定义的 explicit operator bool
转换。
在尝试使用空指针时,我尝试编写代码来检查指针是否为空:
#include <iostream>
using namespace std ;
int main(){
int *p = 0;
if(!p == true){
cout<<"nullptr\n";
}
else{
cout<< "no\n";
}
return 0;
}
工作正常,没有任何错误,但是当我尝试这个时(根据我的说法,这基本上是同一件事,但显然不是):
#include <iostream>
using namespace std ;
int main(){
int *p = 0;
if(p == false){
cout<<"nullptr\n";
}
else{
cout<< "no\n";
}
return 0;
}
我收到一个错误:“错误:ISO C++ 禁止比较指针和 整数 [-fpermissive]"
谁能告诉我这两个代码有何不同,为什么第二个代码会出错?
当您对指针 p
执行 !
时,您会得到 true
或 false
值,具体取决于 p
是否为 [=15] =] 或不。显然,比较2个bool
就可以了。
当你做p == true
时,左边仍然是一个指针,你不能比较指针和bool
s。
这与隐式和显式转换的区别,以及bool
类型的特殊状态有关关于显式转换。
通常,虽然您可以在整数和指针(任一方向)之间进行转换,但您只能显式 进行强制转换。没有转换意味着没有转换,你会得到一个错误。
这里的特殊例外来自bool
类型的特殊处理和"boolean contexts"的特殊状态。基本上,有一些句法上下文:
if
、while
或for
语句的条件表达式操作数!
一元运算符的操作数?
/:
三元运算符的第一个操作数&&
/||
的操作数
是 "boolean contexts" -- 操作数必须是布尔值 -- 并且其他类型的操作数可以隐式转换为 bool
即使此类转换通常需要显式转换
这说明了为什么您的第一个示例有效——您使用的是一元 !
,它是允许转换为 bool 的特殊布尔上下文之一,就好像存在显式强制转换一样。
这与指针没有什么特别的关系——同样的事情发生在任何用户定义的 (class) 类型上,该类型具有为其定义的 explicit operator bool
转换。