見出し画像

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」。
これが正しいように思うんだけどなぁ。

この記事が気に入ったらサポートをしてみませんか?