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

C: printf not executed, possible compiler optimization?

我的代码中有以下行:

1 || printf("A");

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

在表达式 a || b 中,b 仅在 a 为假时计算(类似地在 a && b 中,b 仅在 atrue)。这被称为短路,它不是优化,而是标准规定的行为。如果编译器做了任何其他事情,它就不是一个有效的实现。

这允许您执行类似 a != NULL && a->isValid() 的操作,并确保您没有取消引用空指针。

I am guessing this is due to compiler optimizations: 1 was evaluated as true, and, because the entire OR expression must have been true, the printf("A") wasn't even evaluated..

是否执行printf("A")函数的决定不是在编译期间做出的,而是在程序执行期间做出的。所以,这排除了你对compilation optimization.

的解释

在表达式exp1 || exp2中,首先计算exp1。如果它计算为 true,则 exp2 不会被计算,因为逻辑运算符的结果是 true,尽管 exp2 的值。但是,如果 exp1 为假,则 exp2 将被评估。此行为是标准强制要求的。

因此,在表达式 1 || printf("A") 中,无需计算 printf("A"),因为表达式的结果将是 true,尽管计算了 [=10] =] 由于第一个表达式是 1.

类似地,当在两个表达式之间使用逻辑 AND 运算符 && 时,表达式被计算 (from left to right)。