2

以下のコード スニペットは、ここの Herb Sutter のブログからのものです。

g++ 出力10. MSVC も出力を行います10。出力はコンパイラによって異なる場合があります。

変数iがどのようにインクリメントされるか理解できません。出力がどのようになるのか、誰でも説明できますか10?10本当に正しい出力ですか?

#include <iostream>
#include <vector>
#include <string>

int main()
{    
    std::vector<int> v = { 0, 0 };
    int i = 0;
    v[i++] = i++;
    std::cout << v[0] << v[1] << std::endl;
}
4

2 に答える 2

1

編集済み

未定義の動作についての議論は省略し、プログラムが指定された出力にどのように到達するかに焦点を当てます。

まず第一に、事実を述べましょう:

  • i++ は i の値をインクリメントしますが、インクリメントされる前に i が保持していた元の値を返します。

from ++i と i++ の違いは何ですか? .

さて、ライン

v[i++] = i++;

あなたの場合、「LHS」->「RHS」->代入の順に評価されます。

  • LHS、v[i++]: i は 1 にインクリメントされ、i++ は v[i++] に 0 を返します。
  • RHS、i++: i の値は 1 になりましたが、2 にインクリメントされますが、RHS の i++ は 1 を返します。
  • 代入: 上記から、代入の結果は次のようになります: v[0] = 1 (その後、i の値は 2 になります)。

したがって、v[0] と v[1] を出力すると、それぞれ 1 (更新された値) と 0 (初期化された値) として評価されます。

于 2015-12-07T10:33:18.263 に答える