c - 嵌套赋值语句和副作用

标签 c side-effects

在阅读 The C Programming Language 时,我注意到在求值顺序部分的优先顺序中指出“...函数调用、嵌套赋值语句和递增和减量运算符会导致“副作用”……”。

我试图找到一些导致未定义行为的嵌套赋值语句的示例。在书中,它声明以下内容ok:

int nl, nw, nc;
nl = nw = nc = 0;

其中 nlnwnc 都将被分配 0

然后,我遇到了this其中指出:

x = y = y = z/3;    

“推荐”。所以我的问题是,这个声明可能有什么问题?赋值从右开始关联,因此该语句等同于:

x = (y = (y = z/3));    

对我来说,y = z/3x = 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/

相关文章:

c - 是否可以在另一个函数的定义中提供函数名称作为初始值设定项?

c - 打印时我的二维数组中缺少一个元素

c++ - 从 C++ 中与 C 灵活数组成员互操作的正确方法是什么?

functional-programming - 为什么引发异常是副作用?

android - Jetpack Compose 中的副作用

C 单元测试 - 从 stub 的优雅退出例程返回

c - 为什么我的代码只返回一个函数?

functional-programming - 纯函数式编程是否可能产生副作用

unit-testing - 具有副作用的单元测试功能?

haskell - `pure x::IO a` 是纯值还是有副作用的值?