#include<stdio.h>
void main()
{
int a=5;
printf("%d\t%d\t%d\n",a,a++,++a);
}
gccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)で767を示す上記のプログラムの出力。7 6 6の代わりに表示されているのはなぜですか?
#include<stdio.h>
void main()
{
int a=5;
printf("%d\t%d\t%d\n",a,a++,++a);
}
gccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)で767を示す上記のプログラムの出力。7 6 6の代わりに表示されているのはなぜですか?
プログラムは好きなものを何でも表示でき、出力は正しいです。
動作は未定義です。何でも起こります。
未定義とは何ですか?
a
引数リストで2回インクリメントしてprintf()
。の動作void main()
は、せいぜい実装定義です。の戻りタイプは。であるmain()
必要がありますint
。
§6.5式
¶2スカラーオブジェクトの副作用が、同じスカラーオブジェクトの異なる副作用、または同じスカラーオブジェクトの値を使用した値の計算のいずれかに対してシーケンスされていない場合、動作は定義されていません。式の部分式に許容される順序が複数ある場合、そのような順序付けられていない副作用がいずれかの順序で発生した場合の動作は定義されていません。84)
84)この段落は、次のような未定義のステートメント式をレンダリングします
i = ++i + 1; a[i++] = i;
許可しながら
i = i + 1; a[i] = i;
Cでundefinedの1つのステートメントで同じ変数を複数回変更する。結果は予測不可能であり、コンパイラ間で非常に異なる可能性があるため、これは避ける必要があります。
「a++」と「++a」の違いの簡単な説明は次のとおりです。
「a++」では、増分は操作後に行われず、「++a」は操作の前に行われます。
例えば:
a = 0; print("%d ", a++); printf("%d ",a);
あなたに与えるだろう0 1
。
a = 0; print("%d ", ++a); printf("%d ",a);
あなたに与えるだろう1 1
。