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

use*_*362 4 c

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

这给了我一个无限循环:

while((*searchNodePtr).data != dataValue && searchNodePtr != NULL) {
    prevNodePtr = searchNodePtr;
    searchNodePtr = (*searchNodePtr).next;  
}
Run Code Online (Sandbox Code Playgroud)

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

while(searchNodePtr != NULL && (*searchNodePtr).data != dataValue) {
    prevNodePtr = searchNodePtr;
    searchNodePtr = (*searchNodePtr).next;  
}
Run Code Online (Sandbox Code Playgroud)

任何澄清将非常感激.谢谢.

Kni*_*nug 6

这是由于短路评估.在第一次while你取消引用一个NULL-pointer(未定义的行为)时searchNodePtr,NULL因为检查NULL只发生在那之后.

而在第二个while当第一个操作数&&为假时,第二个操作数不会被评估.因此,当searchNodePtrNULL表达(*searchNodePtr).data不评估,而你没有取消引用NULL终场.