【发布时间】:2011-02-01 21:41:13
【问题描述】:
当左值的评估先于右值的评估并且赋值也返回一个值,以下哪个是首先评估的?
int i = 2;
int x[] = {1, 2, 3};
int y[] = {4, 5, 6};
int z[] = {7, 8, 9};
x[--i] = y[++i] = z[i++]; // Out of bound exception or not?
注意:具有左值评估的通用类 C 语言。 来自我的教科书:
在某些语言中,例如 C, 分配被认为是 运算符,其评估,此外 产生副作用,也 返回由此计算的 r 值。 因此,如果我们用 C 编写:
x = 2;
对这样一个命令的评估,在 除了将值 2 分配给 x, 返回值 2。因此,在 C 中, 我们也可以这样写:
y = x = 2;
应该解释为:
(y = (x = 2));
【问题讨论】:
-
未定义的行为,我认为...
-
另外,C 中不存在“越界”异常。而且,您的声明在语法上不正确。
-
你肯定明白用“伪语言”要求语言规则是多么的没有意义。
-
我在两个不同的编译器上编译了你的代码;使用 GCC(它警告
i上的操作可能未定义),在所有分配之后,i等于 3。使用 Clang,i在所有分配后等于 9。 Gremo,您需要了解评估序列和序列点是两个不同的概念。当您在一个序列点(在本例中为i)内多次修改变量时,行为未定义。 -
主题有误导性,这个问题是周序点UB废话的重复。
标签: c variable-assignment operator-precedence undefined-behavior