左侧部分&&
总是在右侧部分之前评估吗?
我想知道,因为我想知道我是否可以改变
if(i > 0)
if(someFunc(arr[i-1], arr[i]))
//do work
至
if(i > 0 && someFunc(arr[i-1], arr[i]))
或者如果右侧首先被评估并被arr[0-1]
引用,这会导致未定义的行为吗?
左侧部分&&
总是在右侧部分之前评估吗?
我想知道,因为我想知道我是否可以改变
if(i > 0)
if(someFunc(arr[i-1], arr[i]))
//do work
至
if(i > 0 && someFunc(arr[i-1], arr[i]))
或者如果右侧首先被评估并被arr[0-1]
引用,这会导致未定义的行为吗?
是的,由于逻辑运算符的短路行为,如果第二个表达式仅在第一个为真时计算。阅读以下内容:&&
&&
6.5.13 逻辑与运算符
4 与按位二元
&
运算符不同,运算&&
符保证left-to-right
求值;在计算第一个操作数之后有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
所以如果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)
- 如果a
是false
,b
将不会被检查。if(a && b)
- 如果a
是true
,b
将被检查,因为如果是false
,则表达式将为false
。if(a || b)
- 如果a
是true
,b
则不会被检查,因为true
无论如何都是这样。if(a || b)
- ifa
isfalse
,b
将被检查,因为 ifb
istrue
then itll betrue
。
是的。&&
运算符,||
和(三元运算符),
的求值顺序? :
保证从左到右。这些操作数的左右子表达式之间会出现一个序列点。&&
这些运算符 ( ,||
和)的左子表达式的所有副作用,
都在对其右子表达式的任何访问之前完成。
如果首先评估右侧并被
arr[0-1]
引用,这会导致未定义的行为吗?
是的。如果是这种情况,它将导致未定义的行为。(但它不会那样发生,所以不会有任何未定义的行为。)