我有以下代码 -
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中关闭它?
答案 0 :(得分:3)
有效地操作员&lt;&lt;是一个函数调用,允许c ++按照它喜欢的任何顺序计算传递给函数的参数,因此++ c inc首先由你的编译器完全合法地完成 - 我做了不同的事情。
我的编译器间隔打印
8 8 8 7 7
有些编译器为函数参数的评估顺序提供了开关,但是如果你真的需要使用它,我会质疑自己的原因,因为代码有更多错误,而是以便携方式编写
答案 1 :(得分:2)
a
,b
和c
都是同一个对象。但是,未定义函数参数的计算顺序。所以,无论编译器选择首先评估什么都可以。看来,在您的第二个表达式中,它首先评估++c
。避免问题的方法不是将修改与表达式的其余部分一起折叠,即在输出之前或之后递增c
。