摘自ISO/IEC 9899:201x第5.1.2.3节程序执行第2段:
访问易变对象、修改对象、修改文件或调用执行这些操作的函数都是副作用,是执行环境状态的改变。表达式的求值通常包括值的计算和副作用的产生。左值表达式的值计算包括确定指定对象的身份。
段落说“修改一个对象”是一个副作用。这意味着下面的代码:
int x;
x = 1;
有一个副作用是< code>x = 1,因为它修改了对象< code>x。
然而,根据关于C编程的wikibooks:
在C语言中,更一般地说,在计算机科学中,如果一个函数或表达式修改了其作用域之外的状态,或者与其调用函数或外部世界有可观察到的交互,则称该函数或表达式有副作用。按照惯例,返回值对调用函数有影响,但这通常不被认为是副作用。
一些副作用是:
那么,谁是对的呢?x = 1
真的是副作用吗?即使它不会改变超出其范围的任何内容?还是我错误地解释了标准?
那么,谁是对的呢?
当涉及到标准中的定义时,它是标准。
< 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标准中被称为可观察的效果。