Mat*_*att 8 c optimization gcc
很容易看出:
(i % 3 == 0) && (i % 5 == 0)
Run Code Online (Sandbox Code Playgroud)
可以简化为:
(i % 15 == 0)
Run Code Online (Sandbox Code Playgroud)
然而,考虑到GCC的输出,即使在高优化级别下也似乎没有这样做.
是否有任何编译器进行这些优化,或者这两个测试在语义上是否相同是否有充分理由?
编辑:回应那些说这是边缘情况的人,以下是类似的情况:
(i < 3) && (i < 5)
Run Code Online (Sandbox Code Playgroud)
任何小于3的数字必须始终小于5.第二次测试是多余的.
我还想添加以下内容以回应编译器无法知道环境是否受到影响的答案...看看这段代码:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
Run Code Online (Sandbox Code Playgroud)
整个功能由GCC减少为"repz ret" -O2.这比我说的任何事都复杂得多.
忽略所有愚蠢的答案,声称这对编译器来说非常困难/不可能.我认为没有理由为什么会这么困难,但可能没有人想到这样做或者认为优化是非常重要的.如果您想要一个比这更好的答案,您需要在GCC错误跟踪器上报告它作为增强请求,并看看开发人员说什么.