C: printf 未执行,可能的编译器优化?
C: printf not executed, possible compiler optimization?
我的代码中有以下行:
1 || printf("A");
我惊讶地发现 A 没有打印出来;我猜这是由于编译器优化:1 被评估为 true,并且,因为整个 OR 表达式必须是 true,printf("A")
甚至都没有被评估......有人可以证实这一点吗?程序在不同的编译器下会有这样的表现吗?
在表达式 a || b
中,b
仅在 a
为假时计算(类似地在 a && b
中,b
仅在 a
是 true
)。这被称为短路,它不是优化,而是标准规定的行为。如果编译器做了任何其他事情,它就不是一个有效的实现。
这允许您执行类似 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
)。
我的代码中有以下行:
1 || printf("A");
我惊讶地发现 A 没有打印出来;我猜这是由于编译器优化:1 被评估为 true,并且,因为整个 OR 表达式必须是 true,printf("A")
甚至都没有被评估......有人可以证实这一点吗?程序在不同的编译器下会有这样的表现吗?
在表达式 a || b
中,b
仅在 a
为假时计算(类似地在 a && b
中,b
仅在 a
是 true
)。这被称为短路,它不是优化,而是标准规定的行为。如果编译器做了任何其他事情,它就不是一个有效的实现。
这允许您执行类似 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
)。