我的代码中有以下行:
1 || printf("A");
我很惊讶地看到 A 没有打印出来;我猜这是由于编译器优化: 1 被评估为 true ,并且因为整个 OR 表达式必须是是的,printf("A")
甚至没有评估......有人可以证实吗?使用不同的编译器,程序会表现得这样吗?
答案 0 :(得分:6)
在表达式a || b
中,b
仅在a
为假时进行评估(类似于a && b
,b
仅在a
时进行评估是true
)。这被称为短路,它不是优化,它是标准规定的行为。如果编译器做了其他任何事情,它就不是一个有效的实现。
这允许您执行a != NULL && a->isValid()
之类的操作,并确保您没有取消引用空指针。
答案 1 :(得分:0)
我猜这是由于编译器优化:1被评估为true,并且,因为整个OR表达式必须为true,所以printf(“A”)甚至没有被评估..
执行printf("A")
函数的决定不是在编译期间进行的,而是在程序执行期间进行的。因此,这排除了您对compilation optimization
的解释。
在表达式exp1 || exp2
中,首先计算exp1。如果评估为true
,那么exp2
不会被评估为逻辑运算符true
的结果,尽管exp2
的值为exp1
。但是,如果exp2
为false,则会评估1 || printf("A")
。此行为是标准规定的。
因此,在表达式printf("A")
中,无需评估true
,因为尽管对printf("A")
进行了评估,但表达式的结果仍为1
由于第一个表达式为from left to right
。
类似地,当在两个表达式之间使用逻辑AND运算符&&
时,将对表达式求值({{1}})。