9

可能重复:
逻辑比较:保证从左到右的评估?

我被告知对于每个 C 函数参数,最右边的参数将首先被执行/处理,并且它向左前进。右侧部分将首先执行,然后向左进行。

这是否适用于 && 和 || 等条件???

如果我正在编写 C++ 代码,我会先检查 NULL 条件,然后再检查是否执行我的操作。例如

 if( CommDevice != NULL)
   {
      if(CommDevice->isOpen == TRUE)
         { 
                //Do Something
         }

   }

我可以把它转换成if((CommDevice != NULL) && (CommDevice->isOpen == TRUE) )

“代码从右到左执行”的恐惧阻止了我,因为如果CommDevice是 NULL,我正在尝试访问 NULL 的成员。它会产生异常。

4

5 回答 5

10

我被教导每个 C 函数都从右到左接受参数。右侧部分将首先执行,然后向左进行。

这是 100% 不正确的。参数评估的顺序未指定!

&&和的顺序||是定义的,因为它形成了一个序列点。首先评估左侧,如果没有短路,则评估右侧。

if((CommDevice != NULL) && (CommDevice->isOpen == TRUE) )

这是对的。

于 2012-11-07T06:30:28.160 回答
3

摘自C Programming LanguageBrian Kernighan 和 Ritchie Dennis(C 的作者)的“”:

  • “由 && 或 || 连接的表达式从左到右进行评估,并且保证一旦知道真假,评估就会停止。”

我应该指出,我曾经将 C 中的评估规则的顺序&&||以下内容混淆:

x = f() + g();

请注意,无法确定f()vs.的评估顺序。g()

于 2012-11-07T06:34:57.560 回答
0

&&从左到右评估,而不是从右到左!所以你的代码不会抛出任何异常。

于 2012-11-07T06:30:28.767 回答
0

函数参数的评估顺序是Unspecified。所以无论你学到什么,都不符合语言标准。

关于您的代码:

&&指定和的评估顺序,||这是Left to right

这也遵循语句的短路&&如果 1st is falsethen the rest of the conditions will not be executed. ||如果第一个是类似的,true那么其余的条件将不会被执行。

也是&&||是序列点。

于 2012-11-07T06:44:10.487 回答
0

就逻辑运算符而言,您正在触及短路评估

首先检查左侧的指针是安全NULL的,因为如果此条件返回 false,则&&(从左到右) 的下一个条件不被评估。

&&由于 和 的基本逻辑原则,这种行为是允许的||

于 2012-11-07T06:32:19.530 回答