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使用起来简直不要太爽! ↩︎

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值