维基百科表示:
在计算机科学中,如果一个操作、函数或表达式修改了其本地环境之外的某些状态变量值,则称其具有副作用,也就是说除了向操作调用者返回一个值(主要效果)之外,还具有可观察的影响。
但是我们如何访问本地环境之外的变量呢?有人能够简明扼要地解释一下这种情况、副作用、主要效果和序列点吗?
维基百科表示:
在计算机科学中,如果一个操作、函数或表达式修改了其本地环境之外的某些状态变量值,则称其具有副作用,也就是说除了向操作调用者返回一个值(主要效果)之外,还具有可观察的影响。
但是我们如何访问本地环境之外的变量呢?有人能够简明扼要地解释一下这种情况、副作用、主要效果和序列点吗?
一个函数应该是一个黑匣子,仅根据输入参数返回值或通过引用传递的变量的值可以改变。
除了这些情况之外,函数产生的任何其他可观察变化都是副作用。最著名的例子可能是printf()
函数,它除了返回写入的字符数之外,还会更改标准输出的内容,这意味着它会改变与管道、文件或屏幕相关联的某个内存缓冲区,并且不属于函数的本地环境。
状态是程序的属性,它告诉我们程序/函数/变量的行为。
例如,观察“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
----------------
int stateOfP(int a, char *p)
{
*p = 0;
return a+1;
}
int a = 0;
void stateChange(int p)
{
a++; // here the function is having side effects as 'a' is not its attribute
return;
}