#include <iostream>
using namespace std;
int main()
{
int x[3] = {};
int i=0;
x[i] = i++;
cout << x[0] << " " << x[1] << endl;
return 0;
}
键盘给我这个:第9行:警告:'i'上的操作可能未定义 为什么操作未定义?
答案 0 :(得分:7)
在此明确解释:C-Faq
为什么这段代码没有:a[i] = i++;
有效?
子表达式
i++
会产生副作用 - 它会修改i'
的值 - 这会导致未定义的行为,因为i
也会在同一表达式的其他位置引用。没有办法知道参考是否会在副作用之前或之后发生 - 事实上,两种明显的解释都不会成立;见问题3.9。 (请注意,尽管K&amp; R中的语言表明此表达式的行为未指定,但C标准更强烈地声明它未定义 - 请参阅问题11.33。)
相关标准报价如下:
C ++ 03 5表达式[expr]:
第4段:
....
在前一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值。此外,只能访问先前值以确定要存储的值。对于完整的子表达式的每个允许排序,应满足本段的要求 表达; 否则行为未定义。
答案 1 :(得分:5)
您正在修改变量并使用其值而没有插入序列点。当i
出现时,您对x[i]
的价值是什么?因为无论你期望什么,你都错了。