短路求值是否保证了求值顺序?

4
< p >左侧的 && 是否总是在右侧之前被评估?

我想知道这个问题,因为我想知道是否可以更改

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

如果 i > 0 && someFunc(arr[i-1], arr[i]),则执行以下操作:

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


4
是的,由C保证。 - ouah
2个回答

3
由于逻辑运算符的短路行为,当使用&&时,在第一个表达式为真时才会评估第二个表达式。请阅读以下内容:

6.5.13 逻辑 AND 运算符

4 与按位二进制 & 运算符不同,&& 运算符保证从左到右进行评估;在评估第一个操作数后有一个序列点。如果第一个操作数等于 0,则不评估第二个操作数。

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

如果i > 0为假(例如,如果i = 0),则i > 0表达式的结果将为false,然后第二个操作数someFunc(arr[i-1], arr[i]将不会被调用(计算)。

因此,if(i > 0 && someFunc(arr[i-1], arr[i]))是安全的编码方式,但要注意i - 1不应该大于arr[]的最大索引值。实际上,我更喜欢这种形式的if语句比嵌套的if块(扁平比嵌套好)。

来自@Maroun Maroun的回答"Is there any reason for asking if(1 || Foo())?"可能会帮助您获得额外的信息:

  • if(a && b) - 如果 afalse,那么不会检查 b
  • if(a && b) - 如果 atrue,那么会检查 b,因为如果 bfalse,整个表达式将是 false
  • if(a || b) - 如果 atrue,那么不会检查 b,因为此时整个表达式已经是 true 了。
  • if(a || b) - 如果 afalse,那么会检查 b,因为如果 btrue,则整个表达式也会是 true

1
是的。运算符&&、||、,和? :(三元运算符)的求值顺序从左到右保证。在这些操作数的左右子表达式之间存在一个sequence point。这些运算符(&&,||和,)的左子表达式的所有副作用都在访问其右子表达式之前完成。
引用块: 会不会导致未定义行为,如果右侧先被评估并引用了arr [0-1]?
是的。如果是这种情况,它将导致未定义的行为。(但它不会以那种方式发生,因此不会有任何未定义的行为。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接