递增问题

3 c++

可能重复:
任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)

我有一个像这样声明的变量:

int j=0;
Run Code Online (Sandbox Code Playgroud)

我写的时候:

cout<<j++<<" "<<j++<<" "<<j++<<"\n";
Run Code Online (Sandbox Code Playgroud)

我收到这个输出:

2 1 0
Run Code Online (Sandbox Code Playgroud)

我希望收到这个输出:

0 1 2 
Run Code Online (Sandbox Code Playgroud)

你能解释一下结果吗?

Bin*_*ier 10

规范说如果在同一序列点中多次修改同一个变量,结果是"未定义".

序列点介于; (也是一个序列点,不确定是否还有其他的).

你所尝试的是与众所周知的琐事问题相同,"第二次任务后x的价值是什么?"

int x;
x = 0;
x = x++;
Run Code Online (Sandbox Code Playgroud)

答案是"未定义".

  • @Neil.那不完全准确.函数调用的唯一限制是在调用函数之前必须完全评估所有参数.对于像这样的链接函数,它是单个表达式,并且所有调用都在相同的序列点之间. (3认同)

Kon*_*zin 6

这段代码相当于

... operator<<( operator<<( operator<<( operator<<(cout,j++), " " ), j++ ), "\n" ); ...
Run Code Online (Sandbox Code Playgroud)

虽然给出了函数调用的顺序,但参数评估的顺序不是.因此,无法保证首先评估j ++.j之间没有序列点的修改,因此您可以看到未定义行为的结果.

[编辑1]以前有不准确之处.operator <<(int)是basic_ostream的成员函数.将operator <<(int)表示为f,operator <<(ostream&,const char*)表示为g.然后我们有

...g(f(j++)," ").f(j++)...
Run Code Online (Sandbox Code Playgroud)

评估顺序仍然可以是:eval(j ++) - > eval(j ++) - > 序列点 - > call(f) - > sequence point - > call(g) - > sequence point - > call(f).这是因为以下来自标准[expr.4]的引用:

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.