C的副作用是什么?

问题描述 投票:0回答:1

维基百科上是这么说的。

在计算机科学中,一个操作,函数或表达式被称为有一个。副作用 如果它在其本地环境之外修改了一些状态变量的值,也就是说除了返回一个值(主效应)给操作的调用者之外,还有一个可观察到的效应。

但是,我们如何访问一个变量在其本地环境之外,有谁能把这种情况、副作用、主效应和序列点解释清楚?

c scope side-effects sequence-points
1个回答
1
投票

一个函数是(应该是)一个黑盒子,在这个黑盒子里,返回值或通过引用传递的变量值应该是唯一可能根据输入参数而改变的东西。

在这些情况之外,函数产生的任何其他可观察到的变化都是副作用。最著名的例子可能是 printf() 函数,该函数除了返回写入的字符数外,还改变了标准输出的内容,也就是改变了一些与管道、文件或屏幕等相关联的内存缓冲区,而这些缓冲区并不属于函数的本地环境。


2
投票

在C语言中,并没有所谓的 "主效果"。

形式上的定义是 副作用 (C17 5.1.2.32)中,而是。

访问一个易失性对象,修改一个对象,修改一个文件,或者调用一个函数来完成这些操作,都是: 副作用,这是执行环境状态的变化。

通俗地说,一个副作用就是。

  • 访问一个不稳定的变量,或者
  • 写入任何变量。
  • 或写入文件

(其中 stdout 可能会被视为给定系统的文件)。)

这在确定是否允许编译器如何优化代码时是相关的(C17 5.1.2.34)。

在抽象机中,所有的表达式都按照语义的规定进行评估。如果一个实际的实现能够推断出一个表达式的值没有被使用,并且没有产生任何需要的副作用(包括调用一个函数或访问一个易失性对象所引起的副作用),那么它就不需要对表达式的一部分进行评估。

但是在判断一个表达式是否有明确的行为时也是如此,这就是序列点的作用。然而序列点是自己的一个大话题,比如这里的几个答案中就有解释。为什么这些构造体使用增量前和增量后未定义行为?


0
投票

A 国家 是程序的属性,它讲述了程序functionvariable的行为。

例如,观察 "i"(变量)的状态。

int i = 0; // here state of i is only dependent on the value its holding. lets denote the time when i is having a value 0 as State A.
i++; // i = 1, that means its no longer 0 i.e. state changed to state B
i++ // i = 2 . State C
i--; // i = 1, state B
i += 0; // state B

副作用。 一般来说,当有人谈论函数中的副作用时(不管是哪种语言),他们谈论的是函数参数和对象本身变化之外的程序状态的变化。

我喜欢把副作用可视化的方式。

----------------------
            \ <= side effect
           ----------------

一个在C语言中没有副作用的函数(我们不考虑函数是成员函数的可能性)可能是这样的。

int stateOfP(int a, char *p)
{
  *p = 0;
   return a+1;
}

在这种情况下,程序修改了由p指向的内存位置, 但由于p是一个参数指向的内存位置, 我们不把它算作副作用。

一个没有副作用的函数是一件好事,原因有几个。

首先,一个函数没有副作用是件好事,有几个原因。,没有副作用,使得编译器更容易优化函数的使用。

第二,副作用使得证明一个程序的正确性变得更加困难。

最后,当使用多线程时,特别是在C程序中,副作用可能会产生未确定的结果。例如,如果两个线程在C程序中修改了一个普通的全局变量,而没有一些特殊的锁定机制,那么程序的结果是不确定的。

当一个函数出现副作用时,它是什么样子的呢?类似这样的。

int a = 0;
void stateChange(int p)
{
  a++; // here the function is having side effects as 'a' is not its attribute
  return;
}
© www.soinside.com 2019 - 2024. All rights reserved.