小知识-关于表达式的副作用与逗号表达式

《你不知道的js》中卷提到表达式的副作用,没有理解,上网查询后,自我总结如下:

原文出处,感谢前辈:https://www.cnblogs.com/lazycoding/archive/2011/04/27/side-effect.html。

1.概念定义:表达式中变量所起的作用角度来看可分为两类:有副作用的表达式、无副作用的表达式.

无副作用表达式:在表达式求值过程中,需要提取这些变量的值,但并不改变这些变量的值,这样的表达式称为无副作用的表达式.从传统意义上讲,表达式的作用就是计算,它除了产生一个计算结果外,不应该改变参与计算过程的任何变量的值或产生其它的效应.换句话说,传统意义上的表达式是不应该有副作用的.因此,绝大多数的高级语言中的表达式都是无副作用的表达式.

有副作用表达式:一个表达式在求值过程中,对使用的变量不但引用,对它们的值还加以改变,这样的表达式称为有副作用的表达式.

实例:有如下四个表达式:1、5*X;2、X+Y;3、X++;4、Y-=18*2.其中表达式1和表达式2是无副作用的表达式,因为在表达式求值过程中,所引用的变量X和Y的值均未发生变化,例如:已知X=5,Y=10,表达式1的值为25,表达式2的值为15,但X的值仍为5,Y的值仍为10,而表达式3和表达式4是有副作用的表达式, 因为在求表达式值的过程中,所引用的变量X和Y的值均发生了变化.例如:x和Y的值初始状态下分别是5和10 经计算后,表达式3的值为5,X的值变为6,表达式4的值为一26,Y的值变为一26.

  2.对于给出的表达式,怎样才能正确地判断出它是有副作用的表达式还是无副作用的表达式?

主要原因取决于表达式中出现的操作符,如果一个表达式中引用了具有副作用的操作符,该表达式就是有副作用的表达式.C++语言引入的具有副作用的操作及相应的操作符包括: (1)赋值(=). (2)复合赋值(+=,一:, *=,/=,%=,《=,》=,!=,&=,一). (3)前增1,前减1(++, 一一).(4)后增1,后减1(++, 一一).这些操作所作用的对象必须是变量,因此这些操作也可称作用于变量的操作.对于作用于变量的操作,除后增1和后减1以,还有这样一个特点:作为操作结果的表达式的值就是所作用的变量获得的值。

3.逗号表达式

由逗号操作符(即,)将各个表达式连接起来就构成了逗号表达式,即表达式1,表达式2,? ? ,表达式n,逗号表达式的求值顺序是:先计算表达式1的值,然后计算表达2的值,依此类推,最后计算表达式n的值,最后计算出的表达式n的值就作为整个逗号表达式的值.例如:w--,j+=3,k++,P=w+j+k是一个逗号表达式,若初始状态下w=5,j=6,k=7,那么该逗号表达的值为21(5+9+7).对于逗号表达式中的每个表达式,除最后一个外,必须是具有副作用的表达式才有意义,如上例.而像X=5,6+18,72*9,Y=10这个逗号表达式中的表达式6+18和72*9是无副作用的表达式,计算时毫无意义.

你可能感兴趣的:(小知识)