【问题标题】:order of print in c++ [duplicate]C ++中的打印顺序[重复]
【发布时间】:2012-10-02 11:02:48
【问题描述】:

可能重复:
What is the correct answer for cout << c++ << c;?

我有以下代码 -

int a= 7;
const int &b = a;
int &c = a;

如果我使用

cout << endl << ++c << '\t' << a << '\t' << b << '\t' <<  c;

打印出来

"8 7 7 8"

但是如果我使用

cout << endl << a << '\t' << b << '\t' << ++c << '\t' << a << '\t' << b << '\t' <<  c;

打印出来

"8 8 8 8 8 8"

这究竟是怎么发生的?它与优化有关吗?如果是,我如何在 ideone.com 中将其关闭???

【问题讨论】:

  • 当你说cout &lt;&lt; ++c &lt;&lt; c; 时发生的事情有重复。不过,我不确定具体在哪里。
  • @nneonneo,就是这个,谢谢。
  • @nneonneo 谢谢……这是否意味着这将永远是未定义的,并且没有很好的解释这种行为???
  • 是的。未定义的行为意味着未定义的行为。它的输出可能会根据编译器品牌、版本、标志、堆栈布局或完全不同函数中的代码而改变。当然,你总是可以通过查看汇编输出来解释它,但通常你无法预测编译器会做什么。

标签: c++ compiler-optimization cout


【解决方案1】:

实际上 operator

有趣的是我的编译器打印出来

8       8       8       7       7

一些编译器为函数参数的评估顺序提供了开关,但如果你真的需要使用它,我会质疑自己的原因,因为代码有更多错误,而是以可移植的方式编写.

【讨论】:

    【解决方案2】:

    abc 都是同一个对象。然而,函数参数的求值顺序是未定义的。因此,无论编译器选择首先评估什么都可以。看来,在您的第二个表达式中,它首先评估 ++c。避免问题的方法是不要将修改与表达式的其余部分折叠起来,即在输出之前或之后增加 c

    【讨论】:

    • kuhl ....是的..我不会在实践中遵循这个..我只是尝试一些随机的事情并遇到这个问题....它与优化有什么关系还是什么???
    • 大多数情况下,没有定义评估顺序是为了允许优化机会或处理不同的实现约束。
    • Kuhl ...谢谢..这很有帮助。
    猜你喜欢
    • 2021-07-16
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多