我正在学习C中的链接列表,我遇到了一个我不明白的错误。在下面粘贴的代码片段中,当我有while(a&& b)时,我得到一个无限循环,但是当我运行while(b&& a)时,程序可以运行。我是C的新手,并且不明白我为什么在第一种情况下得到无限循环。
这给了我一个无限循环:
yaml.add_constructor
但这可行(在条件操作数时交换):
while((*searchNodePtr).data != dataValue && searchNodePtr != NULL) {
prevNodePtr = searchNodePtr;
searchNodePtr = (*searchNodePtr).next;
}
非常感谢任何澄清。谢谢。
答案 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。