【问题标题】:is there a difference between x==NULL and !x in c++ [duplicate]c++ 中的 x==NULL 和 !x 之间有区别吗?
【发布时间】:2020-03-21 06:56:04
【问题描述】:

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

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++ 中,您实际上应该使用 nullptr
  • 完全没有功能差异。
  • 好的,但是这些有区别吗? ..我会考虑你的观点,这也是一个朋友告诉我的。

标签: c++ null c++14


【解决方案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,否则为true。

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

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

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

一些cmets推荐另一种形式:

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

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

【讨论】:

    【解决方案2】:

    在可以假定NULL 等同于0 的平台上,!node 方法可以工作。在大多数情况下,C++ 的行为方式相同,但这假定与平台相关,并且没有理由为什么 NULL 必须是那个特定值,因为它可以是 theoretically be anything you want

    在现代 C++ 中,我们鼓励您将其表达为 if (node != nullptr) 以说明这种技术性并处理类型安全问题。

    C 程序员出于习惯经常使用!node 的简写版本,但它假设现在NULL 有效。如果这种假设在未来发生变化,很可能会破坏大量这样的代码。

    【讨论】:

    • 不确定该链接与此问题有关。
    • 我补充说,如果您仔细阅读,整个事情将非常感谢帮助人帮了大忙
    • 这看起来像是另一个问题,这很好,但请务必将其作为问题发布,而不是作为答案发布,事实并非如此。还要确保包含 you 遇到的错误,以便我们知道从哪里开始。
    • 如果node 是一个指针,只要node 持有一个空指针值,!node 就为真,否则为假。这不依赖于平台。语言定义区分 null 指针常量(即,在适当的上下文中的 0)和 null 指针值,当您使用为其分配一个空指针常量。当指针在上下文中转换为bool 时,空指针值给出false,任何其他值给出true
    • 这里的关键是,虽然NULL 可以定义为对编译器有意义的任何内容,但空指针 value 具有明确定义的属性,无论细节如何它是如何实现的。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多