C言語でコンパイラ依存した話
久しぶりでした。
コンパイラ依存。
コンパイラによって動作が変わることを言います。C言語では昔からありますが、私自身お目にかかったのは久しぶりです。
コードはこちらの記事のものです。
いつもC言語コードを書きあって楽しませていただいてます。
ちょっと、リンク先のコードを再掲させていただきます。
#define MAX(x,y) ((x) > (y) ? (x) : (y))
int main(void)
{
int i = 3;
int j = 5;
printf("MAX処理前 i = %d, j = %d\n", i, j);
printf("MAX処理中 i = %d, j = %d, max = %d\n", i, j, MAX(++i,j--));
printf("MAX処理後 i = %d, j = %d\n", i, j);
}
こちらのコードが、 Termux の Cコンパイラ clang では動作が異なるというのが発端でした。
物は試しと、Visual Studio、Eclipse でも試してみました。更に机上シミュレーションもしてみた。
リンク先ではブラウザコンパイラを使用されたようですが、4種類のコンパイラで、3種類の結果が現れることと相成りました。
さすがにこれには仰天。
C言語の仕様ではどれが正しいのか。
あるいはどれも間違いなのか。
そもそもC言語の仕様にあるのか。
未だ、解決を見ません。
解決求む(笑)。
以下、5種類の結果です。
ブラウザコンパイラ
MAX処理前 i = 3, j = 5
MAX処理中 i = 4, j = 4, max = 5
MAX処理後 i = 4, j = 4
Termux clang
MAX処理前 i = 3, j = 5
MAX処理中 i = 3, j = 5, max = 4
MAX処理後 i = 4, j = 3
Visual Studio 2019
MAX処理前 i = 3, j = 5
MAX処理中 i = 4, j = 3, max = 4
MAX処理後 i = 4, j = 3
Eclipse
MAX処理前 i = 3, j = 5
MAX処理中 i = 4, j = 3, max = 4
MAX処理後 i = 4, j = 3
机上シミュレーション
MAX処理前 i = 3, j = 5
MAX処理中 i = 3, j = 5, max = 4
MAX処理後 i = 4, j = 3
ちなみに、私の机上シミュレーションと合うのは「Termux clang」。
これが正しいように思うんだけどなぁ。