在尝试空指针时,我尝试编写代码以检查指针是否为空:
#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]“
谁能告诉我这两个代码有何不同?为什么我在第二个代码中出现错误?
最佳答案
这与隐式和显式转换之间的区别以及bool
类型相对于显式转换的特殊状态有关。
通常,虽然您可以在整数和指针(任一方向)之间进行转换,但是只能通过强制转换显式地进行转换。没有强制转换就意味着没有转换,您会得到一个错误。
这里的特殊异常(exception)来自对bool
类型的特殊处理和“ bool(boolean) 上下文”的特殊状态。基本上,有一些语法上下文:
if
,while
或for
语句!
一元运算符?
/ :
三元运算符&&
/ ||
的操作数这是“ bool(boolean) 上下文”(操作数必须是 bool(boolean) 值),并且其他类型的操作数也可能隐式转换为
bool
,即使此类转换通常需要显式强制转换这说明了第一个示例为何起作用-您使用的是一元
!
,它是那些特殊的 bool(boolean) 上下文之一,它允许转换为bool,就好像存在显式转换一样。这与指针没有什么特别的关系-对于任何为其定义了
explicit operator bool
转换的用户定义的(类)类型,同样的事情也会发生。
关于c++ - nullptr和 bool 值之间的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62250967/