c++ - 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
解决方案
显然,指针可以指向一个对象:
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)
。有些人更喜欢明确比较。
推荐阅读
- mysql - JPA Hibernate 多对多 NestedServletException 问题
- http - 当 HTTP 标头和元标记中都存在 Content-Security-Policy 时的问题
- node.js - Node.js 中是否有支持 `addEventListener()` 的工作人员?
- html - 如何编辑 ul li 字体大小和样式?
- python-3.x - 用于将 *args 转换为字符串的 Python 打印函数
- python - 试图找到断开图形的节点集,在python中使用networkx
- python - Pandas Q-Cut by Row
- python - 从多个 PDF 中提取文本并写入单个 CSV
- c++ - std::unitialized_copy 是否有未定义的行为?
- c# - 在 iOS 上使用 RestSharp 100% 丢包率