C++ ==C+中的运算符+;结构指针

C++ ==C+中的运算符+;结构指针,c++,struct,operator-keyword,C++,Struct,Operator Keyword,我在Visual Studio 2017中有以下结构: struct Node { Node* left, *right; int data; }; 考虑以下if语句: if ( root->left == root->right == NULL ) 为什么If语句的计算结果为true, 即使指针未指向同一位置?由于,该行 if ( root->left == root->right == NULL ) 与 if ( (root->left =

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

struct Node
{
    Node* left, *right;
    int data;
};
考虑以下if语句:

if ( root->left == root->right == NULL )
为什么If语句的计算结果为true, 即使指针未指向同一位置?

由于,该行

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

if ( (root->left == root->right) == NULL )
根据
root->left
root->right
的值,第二对
()
中的表达式可以计算为
true
false
。你最终得到的是

if ( true == NULL )

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


您需要使用的是:

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

<>你遇到了C++将隐式转换值的问题。

作为背景,C++中的NULL被定义为0。在指针上下文中,这将隐式转换为值到指针类型值,以测试它是否为null,但null的定义为0在其他上下文中是整数

现在在您的示例中,
node->left==node->right
的结果将给出一个布尔值:
true
false
。假设它们不指向内存中的同一位置,因此此比较将返回
false
bool
false
可以根据上下文隐式转换为值为0的整数

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


简而言之,C++中不能像这样链接比较。如果你把它分解成单个语句,你就得到了你期望的行为。 >代码>根>左=根- >右< /代码> 0,<代码> null <代码>也是0。直观的数学符号,3个比较相等的项目不能直接转化为C++,我想这就是为什么Null pTR比NULL更好。
if ( root->left == NULL && root->right == NULL )