C中的副作用

时间:2013-04-25 17:46:42

标签: c++ c side-effects

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

我认为这是wikipedia的一个很好的定义:

  

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

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

  

“副作用行为的一个常见证据是   C ++中的赋值运算符。例如,赋值返回右侧   操作数并具有将该值赋给变量的副作用。   这允许语法上清晰的多重赋值:“

int i, j;
i = j = 3;

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

提前致谢。

3 个答案:

答案 0 :(得分:9)

您可以将赋值表达式用作值:

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值的变化是副作用。

答案 1 :(得分:4)

如果在计算中修改了世界的状态,例如变量的值,则会产生副作用。

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

一个不太重要的例子:j += 3计算j + 3,但它也会将j设置为此新值。

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

答案 2 :(得分:1)

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

的值