如果我有一些看起来像这样的代码:
if(someInteger || somecomplexfunction() > 0) {
// do something
}
如果someInteger
评估为真,是否会调用该函数?
P.S。使用-O2
答案 0 :(得分:6)
不,它不会。 C中的逻辑运算符短路,所以如果||
的左侧是真的,右侧将不会评估(因此该函数将不会执行,并且它可能没有副作用)生效)。与&&
类似,如果左侧评估为false,则右侧将不会被评估。
这是在C标准中定义的,无论编译选项如何,都可以在任何符合标准的编译器中进行。
虽然这有时会带来更好的性能,但这不是编译器选择制作的优化,而是根深蒂固的C语义。