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

时间:2012-06-21 05:49:05

标签: c++ undefined-behavior sequence-points

  

可能重复:
  Undefined Behavior and 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;
}

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

2 个答案:

答案 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]的价值是什么?因为无论你期望什么,你都错了。