在阅读 The C Programming Language 时,我注意到在求值顺序部分的优先顺序中指出“...函数调用、嵌套赋值语句和递增和减量运算符会导致“副作用”……”。
我试图找到一些导致未定义行为的嵌套赋值语句的示例。在书中,它声明以下内容ok:
int nl, nw, nc;
nl = nw = nc = 0;
其中 nl
、nw
和 nc
都将被分配 0
。
然后,我遇到了this其中指出:
x = y = y = z/3;
不“推荐”。所以我的问题是,这个声明可能有什么问题?赋值从右开始关联,因此该语句等同于:
x = (y = (y = z/3));
对我来说,y = z/3
和 x = z/3
似乎很清楚。因此,如果是这种情况,那么谁能给我一个可能导致未定义行为的嵌套赋值语句的示例,如果不是,您能否解释为什么前面的语句未定义。
最佳答案
赋值语句不限于单个变量。除其他外,您可以分配给数组的元素。
考虑这个嵌套赋值的例子:
int a[] = {100, 200};
a[a[1]] = a[1] = 0;
如果您评估分配的顺序,它应该按如下方式工作:
a[1] = 0
在这个分配之后,a
看起来像这样:{100, 0}
a[a[1]] = 0
知道 a[1]
为零,这与 a[0] = 0
相同,因此数组应如下所示: { 0, 0}
但是,问题是您现在寄希望于这样一个事实,即 a[1] = 0
的副作用在您到达下一个作业时已经完成:否则,您是将零分配给 a[100]
,这远远超出了数组的末尾。
由于在没有 sequence points 的情况下未定义副作用的完成顺序,这是未定义的行为。
关于c - 嵌套赋值语句和副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19897759/