4

左侧部分&&总是在右侧部分之前评估吗?

我想知道,因为我想知道我是否可以改变

if(i > 0)
    if(someFunc(arr[i-1], arr[i]))
        //do work

if(i > 0 && someFunc(arr[i-1], arr[i]))

或者如果右侧首先被评估并被arr[0-1]引用,这会导致未定义的行为吗?

4

2 回答 2

3

是的,由于逻辑运算符的短路行为,如果第二个表达式仅在第一个为真时计算。阅读以下内容:&&&&

6.5.13 逻辑与运算符

4 与按位二元&运算符不同,运算&&符保证left-to-right求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。

来自C/C++ 中是否强制要求短路布尔运算符?和评价顺序?

所以如果i > 0为假(例如 if i = 0),那么i > 0表达式的结果将是假的,然后第二个操作数 someFunc(arr[i-1], arr[i]将不会被调用(评估)。

因此, if(i > 0 && someFunc(arr[i-1], arr[i]))编码是安全的,但要小心i - 1不应该 > 的最大索引值arr[]。真的,与嵌套的 if 块相比,我更喜欢这种形式的 if(扁平比嵌套更好)。

来自@Maroun Maroun的回答“有什么要问的理由if(1 || Foo())吗?” 可能对您有所帮助的其他信息:

  • if(a && b)- 如果afalseb将不会被检查。
  • if(a && b)- 如果atrue,b将被检查,因为如果是false,则表达式将为false
  • if(a || b)- 如果atrueb则不会被检查,因为true无论如何都是这样。
  • if(a || b)- if ais false,b将被检查,因为 if bis truethen itll be true
于 2013-10-10T18:28:51.863 回答
1

是的。&&运算符,||和(三元运算符),的求值顺序? :保证从左到右。这些操作数的左右子表达式之间会出现一个序列点。&&这些运算符 ( ,||和)的左子表达式的所有副作用,都在对其右子表达式的任何访问之前完成。

如果首先评估右侧并被arr[0-1]引用,这会导致未定义的行为吗?

是的。如果是这种情况,它将导致未定义的行为。(但它不会那样发生,所以不会有任何未定义的行为。)

于 2013-10-10T18:26:58.077 回答