ANSI C 中一段话

来源:百度知道 编辑:UC知道 时间:2024/05/31 19:33:21
ANSI/ISO C 标准这样描述:

在上一个和下一个序列点之间, 一个对象所保存的值至多只能被表达式的计算修改一次。而且前一个值只能用于决定将要保存的值。
这句话什么意思??
另外 i = i+1 合法, 而 a[i] = i++ 则非法是为什么 谁能详细解释下

有了序列点的概念,我们下面来分析一下一个很常见的错误:

int x = 1, y;
y = x++ + x++;

这里 y = x++ + x++ 是完整表达式,而 x++ 是它的子表达式。这个完整表达式运算结束的那一点是一个序列点,int x = 1, y; 中的 ; 也是一个序列点。也就是说,x++ + x++ 位于两个序列点之间。标准规定,在两个序列点之间,一个对象所保存的值最多只能被修改一次。但是我们清楚可以看到,上面这个例子中,x 的值在两个序列点之间被修改了两次。这显然是错误的!这段代码在不同的编译器上编译可能会导致 y 的值有所不同。比较常见的结果是 y 的值最后被修改为 2 或者 3。在此,我不打算就这个问题作更深入的分析,各位只要记住这是错误的,别这么用就可以了。

i++将会改变i的值,但是在左边i又被引用了一次,这样没法判断左边i的值。所以ANSI就说他是无定义的。