3

重複の可能性:
C プログラミング: これは未定義の動作ですか?

#include<stdio.h>
main()
{
 int i=5;
 printf("%d%d%d",i,i++,++i);
}

期待される出力は 556 です。しかし、実行すると結果は 767 になります。どうやって?

4

4 に答える 4

1

シーケンスポイント内で値にアクセスして変更しています(実際には2回変更しています)。シーケンスポイント内では、操作の順序について確信が持てません。

つまり、関数呼び出しを左から右に読んでいる間、式がその順序で評価されるとは限りません。最初のiものが最初に評価され、5 が返されます。 i++ が最初に評価され、 と の両方が評価される前に 6 にインクリメントさ++iiます。

于 2010-09-06T17:40:44.293 に答える
1

引数内の命令はコンパイラによって選択された順序で実行されるため、インクリメントが期待どおりの順序で実行されるかどうかはわかりません。

于 2010-09-06T17:37:16.640 に答える
0

興味深いことに、問題は、同じ変数を複数回使用していることです。コードを次のように変更した場合:

int i, j, k;
i=j=k=5;
printf("%i%i%i",i,j++,++k);

期待どおりに動作します。同じ変数を使用すると、操作の順序がめちゃくちゃになると思います。

于 2010-09-06T17:40:02.470 に答える
-1
$ 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

それが方法です。

于 2010-09-06T17:36:54.567 に答える