0

私は本当に接尾辞を理解できません。i最初に識別子を使用し、次に を示し、次に を増減することを知っています++。しかし、今は間違っていると思い、まだ理解していません。

#include <iostream>

using namespace std;

int main()
{
    int i = 0;
    cout << i << i++ << i;
    cout << "\n\n\nPress Enter to close the window . . . ";
    cin.clear();
    cin.sync();
    cin.get();
    return 0;
}

出力:

101


Press Enter to close the window . . . 

最初iはインクリメントが読み取られる前に変更されます。なぜですか?

期待した

001

Press Enter to close the window . . .

誰かが説明できますか。

4

2 に答える 2

5

そのようなことは絶対にしないでください。未定義です

 cout << i << i++ << i;

したほうがいい

 cout << i << i << (i + 1);
 i ++;

期待される結果が必要な場合。


ケース

  cout << i++;

定義されており、完全に問題ありません。

于 2012-06-01T13:56:46.040 に答える
-1

未定義と思うのですが*)ここで関数の引数の評価順です。ここで実際に呼び出しているのは、(オーバーロードされた) への関数呼び出しです。

std::ostream& operator<< (std::ostream&, int);

最初の引数は、同じ関数への別の呼び出しの出力であるため、

cout << i << i++ << i;

に展開します

operator<<( operator<<( operator<<(cout,i), i++), i);

関数の引数が評価される順序は指定されていないため、ここでは何でも発生する可能性があります。別の行を書くことでそれを避けることができます:

cout << i;
cout << i++;
cout << i;

それは無害に展開します

operator<<(cout,i);
operator<<(cout,i++);
operator<<(cout,i);

*) 編集: より正確に言うと、関数の引数の評価順序が unspecified であるためcout<<i<<i++;未定義です。

于 2012-06-01T14:15:05.810 に答える