【发布时间】:2011-04-07 20:03:10
【问题描述】:
好吧,我有点不好意思问这个问题,但我只是想确定一下……
众所周知,C 在布尔表达式中使用短路求值:
int c = 0;
if (c && func(c)) { /* whatever... */ }
在该示例中,func(c) 未被调用,因为 c 的计算结果为 0。但是,如果比较的副作用会改变接下来要比较的变量,那么更复杂的例子呢?像这样:
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
函数canInitWithSomeValue 返回真并在成功的情况下改变给定指针的值。是否保证后续比较(本例中为c == SOMETHING)使用canInitWithSomeValue(&c) 设置的值?
不管编译器使用了多么重的优化?
【问题讨论】:
-
我认为您可能会混淆短路评估和编译器优化。在第一个示例中,编译器将优化掉整个
if语句,因为它永远无法运行。短路评估意味着如果您有if(func1() && func2()) { ... },并且 func1() 在运行时 评估为假(即在编译时不明确),那么代码不应检查func2()- 编译器应该精心设计机器代码,如果func1()为假,则不会调用func2()。 -
int c = 0在比较时表明c等于0,我意识到在这种简单的情况下编译器会优化整个if。 -
啊,我很抱歉。我误读了你。我很抱歉。
标签: c