【问题标题】:Side effects in CC语言的副作用
【发布时间】:2023-03-24 05:45:01
【问题描述】:

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

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

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

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

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

int i, j;
i = j = 3;

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

提前致谢。

【问题讨论】:

  • 引用的文字不正确。赋值操作的值就是赋值,在简单的赋值中,就是右边的值转换为左边的类型。所以,如果 d 是一个值为 3.5 的 double 并且 x 是一个 int,那么 x = d 的值是 3,而不是 3.5。
  • 请注意,引用是关于 C++ 的,它与 C 有很大的不同。
  • 非常重要,感谢@BoPersson

标签: c++ c side-effects


【解决方案1】:

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

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

【讨论】:

  • 我认为他们应该把你的例子放在维基百科的文章中,这样更清楚......
【解决方案2】:

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

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

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

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

【讨论】:

  • 我不明白,那么每一个赋值语句都应该考虑有副作用。喜欢int i = 3
  • 您的意思是“例如,j = 3 计算出 3,但它也会修改 i 的值作为副作用。” ?
  • int i = 3 是一个变量声明:它确定有一个名为i 的变量,其值为3。没有状态被修改,所以在这种情况下没有副作用。
  • 感谢 Jony,但是 int i = 0; i = 1 呢? ?可以认为有副作用吗?
  • 请注意,在您使用 C 的“特性”之前,任何一个赋值——=+=(或 ++)——都不是“副作用”赋值的结果可以用作表达式。
【解决方案3】:

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

【讨论】:

  • 我想说的是反面。 “表达式”j = 3 具有修改 j 的副作用。也就是说,您不能将i = j = 3 的右侧视为不透明的。在一个简单的情况下,比如说这还不算太糟糕,但是将 = 深埋在一个 3 行表达式中,结果对于不研究代码 very 的人来说可能是“令人惊讶的”小心。
猜你喜欢
  • 2021-01-13
  • 2011-06-17
  • 2020-08-23
  • 2023-01-27
  • 1970-01-01
  • 2023-03-04
  • 2014-09-30
  • 2016-04-15
  • 1970-01-01
相关资源
最近更新 更多