C:printf没有执行,可能的编译器优化?

时间:2016-04-30 16:28:54

标签: c printf compiler-optimization

我的代码中有以下行:

1 || printf("A");

我很惊讶地看到 A 没有打印出来;我猜这是由于编译器优化: 1 被评估为 true ,并且因为整个 OR 表达式必须是是的printf("A")甚至没有评估......有人可以证实吗?使用不同的编译器,程序会表现得这样吗?

2 个答案:

答案 0 :(得分:6)

在表达式a || b中,b仅在a为假时进行评估(类似于a && bb仅在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}})。