我读过很多关于C语言中什么是“副作用”的讨论,而且许多人似乎指出,它必须涉及改变一些不是引起改变的函数本地的东西。改变外部变量或文件是讨论中说的必须改变才能符合副作用的典型类型。这些讨论通常还意味着,仅仅在声明局部自动变量的同一个块中更改该变量的值并不会产生副作用。但是,C17标准第5.1.2.3.2条规定如下:
访问一个volatile对象、修改一个对象、修改一个文件或调用一个执行这些操作的函数都是副作用,它们是执行环境状态的变化。
我从C17 www.example.com了解6.2.4.1到所有变量(以及其他事物)都表示对象,如果是这样,那么不管作用域或存储类如何,更改任何变量的值难道不是副作用吗?
1条答案
按热度按时间9o685dep1#
如果是这样的话,不管作用域或存储类如何,更改任何变量的值难道不是副作用吗?
是的。
以代码
a = 3; printf("%d\n", a++);
为例,该代码输出"3",因为a++
的主要作用是为表达式生成a
的值,而a
的值为3。该代码还更改了a
的值,这是一个副作用。以
printf("%d\n", (a = 3) * 4);
为例,赋值表达式a = 3
的主要作用是生成赋值对象的新值,因此它的值为3
,然后乘以4,因此printf
打印"12"。作为副作用,a
的存储值变为3。此外,
printf
写入标准输出,这也是一个副作用。