C ++中的==运算符struct

时间:2018-02-10 19:25:36

标签: c++ struct operator-keyword

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

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

考虑以下if语句:

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

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

2 个答案:

答案 0 :(得分:2)

由于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 )

答案 1 :(得分:1)

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

就像后台一样,C ++中的NULL定义为0.在指针上下文中,这将隐式转换为指向值类型的值,以测试它是否为null,但NULL定义为0是一个整数在其他情况下。

现在,在您的示例中,node->left == node->right的结果将为您提供一个布尔值:truefalse。我们假设它们没有指向内存中的相同位置,因此这种比较将返回falseboolfalse可以隐式转换为值为0的整数,具体取决于上下文。

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

简而言之,你不能在C ++中进行这样的比较。如果将其分解为单个语句,您将获得预期的行为。