それは簡単にわかります。
(i % 3 == 0) && (i % 5 == 0)
次のように簡略化できます。
(i % 15 == 0)
しかし、GCCの出力を調べると、これは高い最適化レベルでも行われていないようです。
これらの種類の最適化を行うコンパイラはありますか、またはこれら2つのテストが意味的に同等ではない正当な理由がありますか?
編集:これはフリンジケースであると言う人々に応えて、以下は同様のケースです:
(i < 3) && (i < 5)
3未満の数値は、常に5未満である必要があります。2番目のテストは冗長です。
また、コンパイラが環境に影響があるかどうかを知ることができないという答えに応えて、次のコードを追加したいと思います...このコードを見てください。
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
関数全体は、GCCによって「repzret」に還元され-O2
ます。それは私が話している何よりもはるかに複雑です。