と呼ばれるグローバル変数と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増加します。