2015-04-12 52 views
0

代码:如何比较指针地址值?

//is leaf? 
if (root->left == root->right == NULL) 
{ 
    cout << "\n is leaf"; 
    cout << ", l: " << root->left << ", r: " << root->right; 
    return; //is leaf 
} 

回报:

is leaf, l: 004EDCD8, r: 004EDC70 

这不是预期的行为。它们显然不相等并且不为空,那么为什么这个声明是真的?

如何比较指针值?

回答

3

有没有三路==算子。这就像如果你会说:

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

因为root->left != root->right,这部分将是错误的(0)。现在我们有:

if (0 == NULL) 

这将评估为true。

你想说的是:

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

完美!谢谢,我认为有一个“隐含”&&。我的错。 –

1
//is leaf? 
if (root->left == NULL && root->right == NULL) 
{ 
    cout << "\n is leaf"; 
    cout << ", l: " << root->left << ", r: " << root->right; 
    return; //is leaf 
} 
+0

-1的任何特定原因? – user2407394

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

这是什么说法打算做什么?

我不是100%确定运算符的优先级,但是你正在做一个比较,它会产生一个布尔结果,然后将布尔结果与其他东西进行比较。

无论哪种方式,这是一个可怕的声明写。但显然这是因为这里的结果不对。你需要解决这个问题。

2

看看operator precedence in C++

表达

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

相当于

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

你所寻找的是:

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

(根 - >左== NULL & &根 - > right == NULL)

应该解决问题。

+0

不,它不会。他试图比较指针值。这个问题已经被正确回答了好几次,其中一个答案甚至被接受了。 –