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

这给了我一个无限循环:

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

但这有效(在条件操作数时交换):
while(searchNodePtr != NULL && (*searchNodePtr).data != dataValue) {
    prevNodePtr = searchNodePtr;
    searchNodePtr = (*searchNodePtr).next;
}

任何澄清将不胜感激。谢谢你。

最佳答案

这是由于 short-circuit evaluation 。在第一个 while 中,当 NULLsearchNodePtr 时,您取消引用 NULL 指针(未定义的行为),因为对 NULL 的检查仅在此之后发生。

而在第二个 while 中,当 && 的第一个操作数为假时,第二个不会被评估。因此,当 searchNodePtrNULL 时,不会计算表达式 (*searchNodePtr).data 并且您不会取消引用 NULL 指针。

关于C - 在这种情况下,逻辑与操作数不可交换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32027102/

10-11 16:07
查看更多