重複の可能性:
C プログラミング: これは未定義の動作ですか?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
期待される出力は 556 です。しかし、実行すると結果は 767 になります。どうやって?
重複の可能性:
C プログラミング: これは未定義の動作ですか?
#include<stdio.h>
main()
{
int i=5;
printf("%d%d%d",i,i++,++i);
}
期待される出力は 556 です。しかし、実行すると結果は 767 になります。どうやって?
シーケンスポイント内で値にアクセスして変更しています(実際には2回変更しています)。シーケンスポイント内では、操作の順序について確信が持てません。
つまり、関数呼び出しを左から右に読んでいる間、式がその順序で評価されるとは限りません。最初のi
ものが最初に評価され、5 が返されます。 i++ が最初に評価され、 と の両方が評価される前に 6 にインクリメントさ++i
れi
ます。
引数内の命令はコンパイラによって選択された順序で実行されるため、インクリメントが期待どおりの順序で実行されるかどうかはわかりません。
興味深いことに、問題は、同じ変数を複数回使用していることです。コードを次のように変更した場合:
int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);
期待どおりに動作します。同じ変数を使用すると、操作の順序がめちゃくちゃになると思います。
$ gcc -Wall arst.c
arst.c:2:1: warning: return type defaults to ‘int’
arst.c: In function ‘main’:
arst.c:5:27: warning: operation on ‘i’ may be undefined
arst.c:5:27: warning: operation on ‘i’ may be undefined
arst.c:6:1: warning: control reaches end of non-void function
それが方法です。