【问题标题】:== operator in C++ Pointer of struct== 运算符在 C++ 结构指针中
【发布时间】:2018-02-10 19:25:35
【问题描述】:

我在 Visual Studio 2017 中具有以下结构:

struct Node
{
    Node* left, *right;
    int data;
};

考虑以下 if 语句:

if ( root->left == root->right == NULL )

为什么 If 语句被评估为真, 即使指针没有指向同一个位置?

【问题讨论】:

  • root->left == root->right 这是 0,NULL 也是 0。
  • 3 项比较相等的直观数学符号恐怕不能直接转换为 C++

标签: c++ struct operator-keyword


【解决方案1】:

由于operator precedence and associativity,该行

if ( root->left == root->right == NULL )

相同
if ( (root->left == root->right) == NULL )

根据root->leftroot->right 的值,第二对() 中的表达式可以计算为truefalse。你最终得到的是

if ( true == NULL )

if ( false == NULL )

第一个计算结果为false,而第二个计算结果为true


你需要用到的是:

if ( root->left == NULL && root->right == NULL )

【讨论】:

    【解决方案2】:

    C++ 隐式转换值的方式遇到了问题。

    作为背景,C++中的NULL被定义为0。在指针上下文中,this会隐式转换成指针类型的值来测试是否为null,但是这个NULL为0的定义是一个整数在其他情况下。

    现在在您的示例中,node->left == node->right 的结果将为您提供一个布尔值:truefalse。假设它们没有指向内存中的同一个地方,所以这个比较将返回falseboolfalse 可以根据上下文隐式转换为值为 0 的整数。

    在您的 if 条件中,编译器会看到 0 代替 NULL。第一次比较的结果将返回false。在第二次比较中,您将 false(第一次比较的结果)与 0(代替 NULL)进行比较,因此编译器将假定您正在尝试将 bool 与整数进行比较。然后编译器会将false 值转换为整数0。然后编译器将执行第二次比较。因此,您最终会测试 0 == 0,当然也就是 true。这就是为什么 if 语句在这种情况下评估为 true 的原因。

    简而言之,您不能在 C++ 中进行这样的链接比较。如果你把它分解成单独的语句,你会得到你期望的行为。

    【讨论】:

    • 这就是为什么 nullptr 比 NULL 更受欢迎的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2011-05-09
    • 2021-01-05
    • 2018-05-20
    相关资源
    最近更新 更多