提问者:小点点

局部变量赋值会产生副作用吗?


摘自ISO/IEC 9899:201x第5.1.2.3节程序执行第2段:

访问易变对象、修改对象、修改文件或调用执行这些操作的函数都是副作用,是执行环境状态的改变。表达式的求值通常包括值的计算和副作用的产生。左值表达式的值计算包括确定指定对象的身份。

段落说“修改一个对象”是一个副作用。这意味着下面的代码:

int x; 
x = 1;

有一个副作用是< code>x = 1,因为它修改了对象< code>x。

然而,根据关于C编程的wikibooks:

在C语言中,更一般地说,在计算机科学中,如果一个函数或表达式修改了其作用域之外的状态,或者与其调用函数或外部世界有可观察到的交互,则称该函数或表达式有副作用。按照惯例,返回值对调用函数有影响,但这通常不被认为是副作用。

一些副作用是:

    < li >修改全局变量或静态变量 < li >函数参数的修改 < li >将数据写入显示器或文件 < li >读取数据 < li >调用其他副作用函数

那么,谁是对的呢?x = 1真的是副作用吗?即使它不会改变超出其范围的任何内容?还是我错误地解释了标准?


共3个答案

匿名用户

那么,谁是对的呢?

当涉及到标准中的定义时,它是标准。

< code>x = 1真的是副作用吗?即使它没有改变它范围之外的任何东西?

是的,你引用的标准段落也是这么说的。

还是我错误地解释了标准?

你正确地理解了标准段落,并将其应用于x=1。但是你试图在标准文本中应用一个外部的口语定义是错误的。C标准并不是要教任何人关于C的知识。它是一个正式的文档,其唯一目的是定义C抽象机器如何执行翻译后的程序。为此,它定义了一堆概念和术语。仅此而已。当为了预测C程序的预期行为而引用这些术语时,只适用标准的定义。

另一方面,这本书的目的是教你C语言。它的目的是让你对C程序的行为有一个“感觉”。但为此,它可能会很好地使用口语和不精确的语言,这是意料之中的。如果这本书有好评,你不应该忽视它,但要记住,它不是一个规范性参考,不像标准。

匿名用户

当C书籍采用C标准中使用的术语(例如副作用)并重新定义它们时,这种混乱就出现了。

C中的副作用与标准中的段落定义完全相同。

因此,yesx=1是一种副作用。

如果规则是否编纂出分配是另一回事。也许,在书中,术语可观察的效果会更好?

匿名用户

您的两个报价都包括副作用的定义:

c标准:

这是执行环境状态的变化

C维基百科:

如果它修改了其作用域之外的状态,或者与其调用函数或外部世界有可观察到的交互。

这些定义了不同的事物,从而造成了混乱。虽然x=1是一种副作用(C标准),但它不是一种副效应(C Wikibook)。C维基书的定义在C标准中被称为可观察的效果。

相关问题