左侧部分&&总是在右侧部分之前评估吗?
我想知道,因为我想知道我是否可以改变
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)- ifaisfalse,b将被检查,因为 ifbistruethen itll betrue。
是的。&&运算符,||和(三元运算符),的求值顺序? :保证从左到右。这些操作数的左右子表达式之间会出现一个序列点。&&这些运算符 ( ,||和)的左子表达式的所有副作用,都在对其右子表达式的任何访问之前完成。
如果首先评估右侧并被
arr[0-1]引用,这会导致未定义的行为吗?
是的。如果是这种情况,它将导致未定义的行为。(但它不会那样发生,所以不会有任何未定义的行为。)