8

と呼ばれるグローバル変数とvar関数がありますfoo。(これは悪い習慣ですが、やむを得ない場合もあります)C標準(c99を使用してコンパイルしています)がvar実行しようとするとどうなるかを示しているのではないかと思います。

long foo(){
    return var++;
}

ありがとう。

4

3 に答える 3

10

短い答え:

のコピーを返し、varその直後にグローバルをインクリメントしますvar

長い答え:

C11 6.5.2.4

「接尾辞++演算子の結果は、オペランドの値です。副作用として、オペランドオブジェクトの値がインクリメントされます。」/--/結果の値の計算は、オペランドの格納された値を更新する副作用の前にシーケンスされます。

標準の5.1.2.3「プログラムの実行」では、プログラムがシーケンスポイントに遭遇する前に、すべての副作用を評価する必要があると指定されています。(シーケンスポイントについては、ここにたくさんあります)。

ステートメントの後にシーケンスポイントがありますreturn(C116.8 / 4)。

これはvar++、main()のコードが続行される前に、式が完全に評価されることが保証されていることを意味します。

マシンコードは次のような擬似コードになります。

  • のローカルコピーをvarスタック(またはレジスタなど)に保存します
  • グローバルを1で増やしvarます。
  • サブルーチンから戻ります。
  • 「copy-of- var」を使用します。

代わりにプレフィックスインクリメントを使用した場合、コピーが保存される前にインクリメント操作がシーケンスされていたはずです。

于 2013-03-25T15:11:22.497 に答える
6

var++ポストインクリメントと同様に、基本的には次のようなものです。

long foo(){
  long tmp = var;
  var++;
  return tmp;
}

代わりに使用する場合は、インクリメントされた値を返します(値を返す++varに変数をインクリメントするため)。

于 2013-03-25T14:41:35.487 に答える
2

foo()varの現在の値を返し、var増加します。

于 2013-03-25T14:39:52.480 に答える