C - 逻辑AND操作数在这种情况下是不可交换的?

时间:2015-08-15 17:03:54

标签: c

我正在学习C中的链接列表,我遇到了一个我不明白的错误。在下面粘贴的代码片段中,当我有while(a&& b)时,我得到一个无限循环,但是当我运行while(b&& a)时,程序可以运行。我是C的新手,并且不明白我为什么在第一种情况下得到无限循环。

这给了我一个无限循环:

yaml.add_constructor

但这可行(在条件操作数时交换):

while((*searchNodePtr).data != dataValue && searchNodePtr != NULL) {
    prevNodePtr = searchNodePtr;
    searchNodePtr = (*searchNodePtr).next;  
}

非常感谢任何澄清。谢谢。

1 个答案:

答案 0 :(得分:2)

C在逻辑表达式(运算符&&,运算符||等)中使用短路评估。

在表达式a && b中,b仅在a为真(非零)时才会被评估。这是因为,如果a为假(零),则b的值不会使表达式a && b给出真实的结果。

至于您的具体情况(*searchNodePtr).data只是searchNodePtr指向有效对象(而不是NULL)的有效表达式。否则它会给出未定义的行为。

所以,你的第一种情况是假设searchNodePtr是非NULL,解除引用它(给出未定义的行为,这意味着如果searchNodePtr实际上是NULL,则所有的赌注都关闭),然后测试{{1是NULL。

第二种情况是检查searchNodePtr不是NULL,然后评估searchNodePtr并测试它是否为真(非零)。这是做这些事情的正确方法。

顺便提一下,(*searchNodePtr).data更可读地表示为(*searchNodePtr).data。但是你仍然应该测试searchNodePtr->data是非NULL。