当l值的求值先于r值的求值,并且赋值也返回一个值时,以下哪一个是首先求值的?

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语言,首先是l值求值。从我的课本上看:
在某些语言中,例如C,
任务被认为是
操作员的评估,另外
产生副作用
返回由此计算的r值。
因此,如果我们用C写:
x = 2;

对这样一个命令的评价
除了将值2赋给x之外,
返回值2。因此,在C中,
我们还可以写:
y = x = 2;

应解释为:
(y = (x = 2));

最佳答案

我很确定,这种情况下的行为是未定义的,因为您在连续序列点之间多次修改和读取变量值i
此外,在C中,数组是通过将[]放在变量名之后而不是类型之后来声明的:

int x[] = {1, 2, 3};

编辑:
从示例中移除数组,因为它们(在大多数情况下)不相关。现在考虑以下代码:
int main(void)
{
    int i = 2;
    int x = --i + ++i + i++;
    return x;
}

这段代码演示了在原始代码中对变量i执行的操作,但没有数组。您可以更清楚地看到变量i在这个语句中被多次修改。当依赖于在连续序列点之间修改的变量的状态时,行为是未定义的。不同的编译器(GCC返回6,Clang返回5)会给出不同的结果,同一个编译器可以通过不同的优化选项给出不同的结果,或者根本没有明显的原因。
如果此语句没有定义的行为,因为i在comsecutive序列点之间被多次修改,那么对于原始代码也可以这样说。赋值运算符不引入新的序列点。

关于c - 表达式x [-i] = y [++ i] = z [i++],哪个先计算?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4868269/

10-11 22:10
查看更多