【问题标题】:comparison between nullptr and booleannullptr 和 boolean 之间的比较
【发布时间】:2020-06-07 20:05:08
【问题描述】:

在尝试使用空指针时,我尝试编写代码来检查指针是否为空:

#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 是一个布尔值。 pint*

标签: c++ nullptr


【解决方案1】:

这与 隐式显式 转换之间的区别以及 bool 类型相对于显式转换的特殊状态有关。

一般来说,虽然您可以在整数和指针之间进行转换(任一方向),但您只能显式通过强制转换来实现。没有演员表意味着没有转换,你会得到一个错误。

这里的特殊例外来自bool类型的特殊处理和“布尔上下文”的特殊状态。基本上,有几个句法上下文:

  • ifwhilefor 语句的条件表达式操作数
  • ! 一元运算符的操作数
  • ?/: 三元运算符的第一个操作数
  • &amp;&amp;/|| 的操作数

它们是“布尔上下文”——操作数必须是布尔值——并且其他类型的操作数可以隐式转换为bool 即使这种转换通常需要显式转换

这说明了为什么您的第一个示例有效 - 您使用的是一元 !,它是允许转换为 bool 的特殊布尔上下文之一,就好像存在显式转换一样。

这与指针没有什么特别的关系——任何用户定义的(类)类型都会发生同样的事情,它定义了explicit operator bool 转换。

【讨论】:

    【解决方案2】:

    当您在指针p 上执行! 时,您将获得truefalse 值,具体取决于p 是否为nullptr。显然,比较 2 个bools 就可以了。

    当你做p == true的时候,左边还是一个指针,你不能比较指针和bools。

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 1970-01-01
      • 2016-10-19
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多