在readed之前更改标识符的后缀?

时间:2012-06-01 13:51:37

标签: c++

我真的不知道后缀。我知道它首先使用标识符,然后增加或减少,首先显示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 . . . 

在递增readed之前,第一个i被更改。为什么?

我期待

001

Press Enter to close the window . . .

有人可以解释一下。

2 个答案:

答案 0 :(得分:5)

永远不要做这样的事情,这是未定义的

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

做得更好

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

如果您需要预期的结果。


案例

  cout << i++;

已定义且完全正常。

答案 1 :(得分:-1)

我认为未定义的*)这里是函数参数评估的 order 。你在这里实际调用的是对(重载)

的函数调用
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++; undefined ,因为未指定中的函数参数的评估顺序。