【问题标题】:Execution direction of && Condition [duplicate]&& 条件的执行方向 [重复]
【发布时间】:2012-11-07 06:28:16
【问题描述】:

可能重复:
Logical comparisons: Is left-to-right evaluation guaranteed?

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

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

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

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

   }

我可以在if((CommDevice != NULL) && (CommDevice->isOpen == TRUE) ) 中转换它吗?

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

【问题讨论】:

标签: c++ c if-statement


【解决方案1】:

来自 Brian Kernighan 和 Ritchie Dennis(C 的作者)的“C Programming Language”:

  • “由 && 或 || 连接的表达式从左到右进行求值,保证在知道真假后立即停止求值。”

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

x = f() + g();

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

【讨论】:

  • +1 用于添加 K&R 参考!
【解决方案2】:

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

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

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

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

这是正确的。

【讨论】:

  • 我认为他所说的“从右到左取参数”的意思是参数传递的顺序,在这种情况下,一般来说,是的,参数在堆栈上以相反的顺序传递。跨度>
  • 是的@mux,我就是这个意思!
  • @mux 我看不出这有什么关系,因为重要的是评估顺序,而不是通过。
  • 还有一个细节:根据参数的类型,可能重载 operator&& 和/或 operator|| -- 当你这样做时,它是一个正常的函数调用,评估的顺序是未指定的。不用说,这样的重载很少是一个好主意。
  • @molbdnilo 这就是为什么我说“一般来说”我想补充一点,它取决于调用约定,但重点是我想为 OP 澄清这一点。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    函数参数的求值顺序是Unspecified。所以无论你学什么都不是按照语言标准。

    关于您的代码:

    指定&&||的求值顺序,这是Left to right

    这也遵循语句的短路 在&& 的情况下,如果第一个是false,则不会执行其余条件。 在|| 中类似,如果第一个是true,则不会执行其余条件。

    而且&&|| 也是序列点。

    【讨论】:

      【解决方案5】:

      就逻辑运算符而言,您涉及的是short-circuit evaluation

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

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

      【讨论】:

        猜你喜欢
        • 2018-03-12
        • 1970-01-01
        • 2017-08-18
        • 2023-03-31
        • 2014-07-18
        • 2014-12-09
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        相关资源
        最近更新 更多