C++求值次序与副作用

来源:互联网 发布:有关网络防沉迷的ppt 编辑:程序博客网 时间:2024/06/05 06:33

编译器在求解表达式时,首先要对表达式进行解析。在符合优先级和结合性的前提下,不同编译器在解析时可能存在差异,使得求值次序不同,将导致结果不同。

例如,设有int a=2, b=5, c; 对表达式 c=a*b+(++a)+(b=10) 三个同级运算中,是先算a*b,还是++a,还是b=10,其次再算哪个?

C语言的标准对表达式中各操作数的求值次序没有做统一规定。对于VC++,是按照从前向后的顺序进行,则上述表达式的结果是23;而对有的C++编译器,则是从后向前进行,结果是43。如果某个操作数经历了求值运算,那么这个求值过程可能影响到其他操作数的值,这时就会产生出乎意料的结果,称为“副作用”(Side effect)。

上例中,求表达式b=10改变了变量b的值,而求++a则改变了a的值,这些都将影响到表达式a*b的值,这就是所谓的副作用。

由于编译器有求值次序,因此对于复合表达式,交换律不一定成立。

求值次序带来副作用的主要原因是使用复合表达式,如果将复合表达式分开写成若干个简单表达式,就可以有效消除副作用。

例如,可将上式按照从前向后的次序写成:
    c=a*b;++a;b=10;c=c+a+b;
或按照从后向前的次序写成:
    ++a; b=10;c=a*b+a+b;

原创粉丝点击