很容易看出:
(i % 3 == 0) && (i % 5 == 0)
可以简化为:
(i % 15 == 0)
然而,查看 GCC 的输出,似乎即使在高优化级别上也没有这样做。
是否有任何编译器进行此类优化,或者是否有充分的理由说明这两个测试在语义上不等效?
编辑:针对那些说这是一个边缘案例的人,以下是一个类似的案例:
(i < 3) && (i < 5)
任何小于 3 的数字,必须始终小于 5。第二次测试是多余的。
我还想添加以下内容以响应编译器无法知道环境是否受到影响的答案...看这段代码:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
GCC 将整个函数简化为“repz ret” -O2
。这比我所说的要复杂得多。