cout 的 << 是如何实现的?运算符在运算符优先级方面的工作?
可能的重复:
意外的评估顺序(编译器错误?)
我无法预测输出对于这个程序:
#include<iostream>
using namespace std;
int *p(int *a)
{
(*a)++;
return a;
}
int main()
{
int i=0;
cout<<i++<<" "<<(*p(&i))++<<" "<<i++<<" "<<i<<endl;
return 0;
}
在vs2008中编译时,它输出3 2 0 4
。有人能解释为什么它不是 0 2 3 4
吗?
注意:如果没有对 p
的函数调用,它会很好地工作。
提前致谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
未定义的行为。什么都可以做。
请参阅此答案以获得很好的解释。
Undefined behaviour. Could do anything.
See this answer for a good explanation.
重点不在于 cout 的优先级,而在于 ++ 运算符。
该运算符的副作用可能发生在两个序列点之间的任何时间,这意味着在本例中,发生在语句中的任何位置。正如 @oli-charlesworth 所说,它发生的确切顺序是未定义的。
cout 的优先级是从左到右,因此首先打印最左边的。但每个数字的值取决于 ++ 的行为。
The point isn't cout's precedence, but the ++ operator.
This operator's side effect can take place any time between two sequence points, which means anywhere in the statemenet, in this case. The exact order it happens is, as @oli-charlesworth says, undefined.
cout's precedence is left to right, so the leftmost is printed first. But the value of each number depends on the behavior of ++.