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

use*_*550 3 c side-effects language-lawyer

根据ISO / IEC 9899:201x5.1.2.3节,程序执行2段:

访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用,它们都是执行环境状态的变化。对表达式的评估通常包括值计算和副作用的启动。左值表达式的值计算包括确定指定对象的身份。

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

int x; 
x = 1;
Run Code Online (Sandbox Code Playgroud)

具有副作用,x = 1因为它修改了对象x

但是,根据有关C编程的Wikibooks

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

一些副作用是:

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

那么,谁是对的?是x = 1一个真正的副作用?即使它不会改变范围之外的任何内容?还是我误解了标准?

Sto*_*ica 8

那么,谁是对的?

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

x = 1一个真正的副作用?即使它不会改变范围之外的任何内容?

是的,您引用的标准段落也说了很多。

还是我误解了标准?

您已正确理解标准段落并将其应用于x = 1。但是您尝试将外部口语定义应用于标准文本是错误的。C标准并不意味着向任何人传授C语言。它是一个正式文档,其唯一目的是定义C抽象机如何执行翻译后的程序。为此,它定义了一堆概念和术语。而已。当引用这些术语以判断C程序的预期行为时,仅适用标准的定义。

另一方面这本书的目的是教您C。它的目的是使您对C程序的行为有“感觉”。但是为此,它很可能会使用口语和不精确的语言,这是可以预料的。如果书具有良好的评价,则不应忽略该书,但请记住,与标准不同,它不是规范性参考。