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

我认为这里的 undefined*) 是函数参数的评估顺序。您在这里实际调用的是对(重载)的函数调用

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);

*) 编辑:更准确地说,cout<<i<<i++;未定义的,因为函数参数的评估顺序未指定

于 2012-06-01T14:15:05.810 回答