我正在学习 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
中,当 NULL
是 searchNodePtr
时,您取消引用 NULL
指针(未定义的行为),因为对 NULL
的检查仅在此之后发生。
而在第二个 while
中,当 &&
的第一个操作数为假时,第二个不会被评估。因此,当 searchNodePtr
是 NULL
时,不会计算表达式 (*searchNodePtr).data
并且您不会取消引用 NULL
指针。
关于C - 在这种情况下,逻辑与操作数不可交换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32027102/