2

我认为我对编程语言中副作用的理解还可以。

我认为这是维基百科的一个很好的定义:

“除了返回一个值之外,它还修改了一些状态或与调用函数或外部世界有可观察的交互。”

但是,我在同一个链接中阅读了此内容(是的,我知道这可能不是寻找示例的最佳位置):

“副作用行为的一个常见演示是 C++ 中的赋值运算符。例如,赋值返回正确的操作数并具有将该值分配给变量的副作用。这允许在语法上干净的多重赋值:”

int i, j;
i = j = 3;

为什么他们认为这是副作用?这与对 2 个局部变量的两个简单赋值语句相同。

提前致谢。

4

3 回答 3

13

您可以使用赋值表达式作为值:

double d = 3.5;

int x, y;

printf("%d", x = d); // Prints "3".

y = (x = d) * 5; // Sets y to 15.

double z = x = d; // Sets z to 3 (not 3.5).

产生的值x = d是它的主要影响。的值的变化x是一个副作用。

于 2013-04-25T18:05:54.773 回答
5

如果世界的状态,例如变量的值,在计算中被修改,这是一个副作用。

例如,j = 3计算 3,但它也会修改 的值j作为副作用。

一个不那么简单的例子:j += 3计算j + 3,但它也设置j为这个新值。

C的语义混淆了水:在C中写的重点i = 1是获得变量赋值的副作用;不计算价值1。在 Haskell 或 Erlang 等函数式编程语言中,将赋值作为副作用的讨论更有意义,其中变量只能被赋值一次。

于 2013-04-25T17:48:44.740 回答
1

我认为这是因为具有将值分配给j = 3的预期效果,但也具有返回值的副作用3jj

于 2013-04-25T17:50:00.117 回答