と呼ばれるグローバル変数とvar
関数がありますfoo
。(これは悪い習慣ですが、やむを得ない場合もあります)C標準(c99を使用してコンパイルしています)がvar
実行しようとするとどうなるかを示しているのではないかと思います。
long foo(){
return var++;
}
ありがとう。
と呼ばれるグローバル変数とvar
関数がありますfoo
。(これは悪い習慣ですが、やむを得ない場合もあります)C標準(c99を使用してコンパイルしています)がvar
実行しようとするとどうなるかを示しているのではないかと思います。
long foo(){
return var++;
}
ありがとう。
短い答え:
のコピーを返し、var
その直後にグローバルをインクリメントしますvar
。
長い答え:
C11 6.5.2.4
「接尾辞++演算子の結果は、オペランドの値です。副作用として、オペランドオブジェクトの値がインクリメントされます。」/--/結果の値の計算は、オペランドの格納された値を更新する副作用の前にシーケンスされます。
標準の5.1.2.3「プログラムの実行」では、プログラムがシーケンスポイントに遭遇する前に、すべての副作用を評価する必要があると指定されています。(シーケンスポイントについては、ここにたくさんあります)。
ステートメントの後にシーケンスポイントがありますreturn
(C116.8 / 4)。
これはvar++
、main()のコードが続行される前に、式が完全に評価されることが保証されていることを意味します。
マシンコードは次のような擬似コードになります。
var
スタック(またはレジスタなど)に保存しますvar
ます。var
」を使用します。代わりにプレフィックスインクリメントを使用した場合、コピーが保存される前にインクリメント操作がシーケンスされていたはずです。
var++
ポストインクリメントと同様に、基本的には次のようなものです。
long foo(){
long tmp = var;
var++;
return tmp;
}
代わりに使用する場合は、インクリメントされた値を返します(値を返す前++var
に変数をインクリメントするため)。
foo()
var
の現在の値を返し、var
増加します。