C++ 阶乘递归出现unsequenced modification and access to
出现问题的代码:
/*** 利用递归实现阶乘 ***/
int fact(int val)
{
if(val == 1)
return 1;
else
return val*fact(--val);
}
我利用的编译器是MinGW1,出现问题的代码在return val *fact(–val)。由于编辑器的不同会出现不同的结果,编辑器可能会出现以下两种结果:
一.从右向左运行
val--;
val*fact(val);
此时左右的val是同一值。
二.从左向右运行(理想)
int temp = --val;
val*fact(temp);
上面的运行结果为24;也就是4!。之所以导致这样的结果就是因为编辑器以第一种运行。而且我在VS Studio上运行也是这个结果。问题就出现在了编译器的运行顺序不确定,我在C++ primer的书籍中也找到的答案。
书里说到:大多数运算符没有规定运算符的求值顺序,一般情况不会有什么影响,但是当一条子表达式改变了某个运算符的值,另外一个子表达式又要使用该值,运算符的顺序就很重要了。所以应该提防复合表达式错用两个运算符。(参见4.6节