4

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

#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”上的操作可能未定义 为什么操作未定义?

4

2 回答 2

7

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

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

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

相关标准报价如下:

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

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

于 2012-06-21T05:52:59.263 回答
5

您正在修改一个变量并使用它的值,而没有中间的序列点。你期望iwhenx[i]出现的值是多少?因为无论你期望什么,你都错了。

于 2012-06-21T05:51:32.573 回答