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'上的操作可能未定义为什么操作未定义?
在这里清楚地解释: C-Faq
为什么这段代码 a[i] = i++;不起作用?
子表达式
i++会产生副作用 - 它会修改i's值 - 这会导致未定义的行为,因为i它也会在同一表达式的其他位置引用.没有办法知道参考是否会在副作用之前或之后发生 - 事实上,两种明显的解释都不会成立; 见问题3.9.(请注意,尽管K&R中的语言表明此表达式的行为未指定,但C标准更强烈地声明它未定义 - 请参阅问题11.33.)
相关标准报价如下:
C++ 03 5表达式[expr]:
第4段:
....
在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改一次其存储值.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.