我在Visual Studio 2017中有以下结构:
struct Node
{
Node* left, *right;
int data;
};
考虑以下if语句:
if ( root->left == root->right == NULL )
为什么If语句被评估为true, 即使指针没有指向同一位置?
答案 0 :(得分:2)
由于operator precedence and associativity,行
if ( root->left == root->right == NULL )
与
相同if ( (root->left == root->right) == NULL )
根据root->left
和root->right
的值,第二对()
中的表达式可以评估为true
或false
。你最终得到的是
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
的结果将为您提供一个布尔值:true
或false
。我们假设它们没有指向内存中的相同位置,因此这种比较将返回false
。 bool
值false
可以隐式转换为值为0的整数,具体取决于上下文。
在if条件中,编译器在NULL的位置看到0。第一次比较的结果将返回false
。在第二个比较中,您将false
(第一次比较的结果)与0(代替NULL)进行比较,因此编译器将假设您正在尝试将bool
与整数进行比较。然后编译器将false
值转换为0的整数。然后编译器将执行第二次比较。因此,您最终测试0 == 0,当然是true
。这就是if语句在这种情况下评估为true的原因。
简而言之,你不能在C ++中进行这样的比较。如果将其分解为单个语句,您将获得预期的行为。