为什么增量操作如"a [i] = i ++;" 导致未定义的行为?

use*_*343 3 c++ undefined-behavior sequence-points

可能重复:
未定义的行为和序列点

#include <iostream>
using namespace std;

int main()
{
int x[3] = {};
int i=0;
x[i] = i++;
cout << x[0] << " " << x[1] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

键盘给我这个:第9行:警告:'i'上的操作可能未定义为什么操作未定义?

Alo*_*ave 7

在这里清楚地解释: C-Faq

为什么这段代码 a[i] = i++;不起作用?

子表达式i++会产生副作用 - 它会修改i's值 - 这会导致未定义的行为,因为i它也会在同一表达式的其他位置引用.没有办法知道参考是否会在副作用之前或之后发生 - 事实上,两种明显的解释都不会成立; 见问题3.9.(请注意,尽管K&R中的语言表明此表达式的行为未指定,但C标准更强烈地声明它未定义 - 请参阅问题11.33.)

相关标准报价如下:

C++ 03 5表达式[expr]:
第4段:

....
在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改一次其存储值.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.


Ben*_*ley 5

您正在修改变量并使用其值而没有插入序列点.你期望什么i时候x[i]出现的价值?因为无论你期望什么,你都错了.