【问题标题】:suffix changing identifier before readed? [duplicate]在阅读之前更改标识符的后缀? [复制]
【发布时间】:2012-06-01 22:50:25
【问题描述】:

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

谁能解释一下。

【问题讨论】:

  • 在接受答案之前,您是否真的阅读了标记副本中的任何答案?因为你接受的答案显然是错误的。

标签: c++


【解决方案1】:

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

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

做得更好

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

如果你想要你的预期结果。


案例

  cout << i++;

已定义并且完全没问题。

【讨论】:

  • 很遗憾,这并没有解释为什么以及什么是 undefined
【解决方案2】:

我认为 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&lt;&lt;i&lt;&lt;i++;undefined 因为函数参数的评估顺序在 unspecified

【讨论】:

  • -1 函数参数的求值顺序不是未定义的,而是未指定的。未指定和未定义是不一样的。此外,您的描述没有正确解释为什么这是未定义的行为。检查标记副本中的答案以确切了解这是未定义的行为。
  • @Als 你为什么批评我而不是编辑和纠正?我认为这个网站是为了互助而不是为了比别人更聪明。顺便说一句,我显然没有点击复制链接。
  • 当我已经非常详细地回答了这个问题时,您是否希望我编辑和更正您的错误答案here 由于您不明白,您应该询问并解决您的疑问,不要发布不正确的答案。拒绝投票是表示对答案不正确或不满意的一种方式。我对您的答案投了反对票,因为它不正确。最后,如果您不能接受批评,请不要发布。仅供参考,您的答案仍然不正确。
  • @Als 为什么你认为我不能接受批评?
猜你喜欢
  • 2016-12-25
  • 2018-08-24
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2021-10-23
  • 2018-12-23
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多