首页 > 解决方案 > c++ 中的 x==NULL 和 !x 之间有区别吗

问题描述

这是我在穿过一棵树时想到的,我写了这个:

if( node==NULL || node->left==NULL && node->left==NULL) return 1;

并且给定的解决方案有:

if(!node || !node->left && !node->right) return 1;

两者之间有区别吗?我知道这可能很愚蠢,但现在只需单击即可。

关于这个问题 https://practice.geeksforgeeks.org/problems/children-sum-parent/1/?track=PC-W6-T&batchId=154

此代码给出错误

int isSumProperty(Node *node){
int l=0,r=0;
if( node==NULL || node->left==NULL && node->left==NULL) return 1;

if(node->left) l=node->left->data; else l=0;
if(node->right) r=node->right->data; else r=0;

return ( node->data == l+r && isSumProperty(node->left) && isSumProperty(node->right) );
}

但是用另一个语句替换第一个 if 语句,你们能解释一下吗?

测试用例附带错误:2 N 1 N 2 N 1 N 1 N 2 N 1

标签: c++nullc++14

解决方案


显然,指针可以指向一个对象:

int i;
int *ip = &i;

指针也可以设置为“空指针值”:

int *ip = nullptr;

C 和 C++ 还具有“空指针常量”的概念,它0用于指针的上下文中:

int *ip = 0; // null pointer constant, sets ip to hold a null pointer value

该常量也包含在宏中,以提高可读性:

int *ip = NULL; //null pointer constant, sets ip to hold a null pointer value

可以测试任何指针是否包含空指针值:

int *ip = 0;
if (ip) { std::cout << "null pointer"; }

当指针用于需要布尔值的地方时,正式地,它会“根据上下文转换为bool”。这就是该if声明中发生的情况。将指针上下文转换为的结果是指针bool是否false为空指针值,否则为真。

在问题中,有两种测试空指针值的形式:

if (node == NULL) // explicit test for null pointer value

if (!node) // `node` contextually converted to `bool`, result is negated

一些评论推荐了另一种形式:

if (node == nullptr) // explicit test for null pointer value

这三个人都做同样的事情。nullptr我们这些在通常使用的日子之前长大的人if (!node)。有些人更喜欢明确比较。


推荐阅读