C++ 递归出现unsequenced-modification-and-access-to

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节,133页)


改进方式

  如果改进的话,就要避免复杂的复合运算,下面是我改进的地方。

int fact(int val)
{
    if(val == 1)
        return 1;
    else
    {   
        val--; //把运算符分开进行运算,来决定他的运行顺序
        return val*fact(val); 
    }
}

注意: 在计算5!的时候注意调用fact(5+1);


  1. 推荐: 鼓励大家使用CLion,JetBrains公司的,利用IDIE使用起来简直不要太爽! ↩︎

你可能感兴趣的:(个人博客,C++,递归阶乘,函数未定义)