下面是自然数和小于cc>的递归函数。

int calculateSum(int n) {
    if (n == 0){
        return 0;
    }else{
        return n + calculateSum(--n); //Replacing --n with n-1 works
    }
}

输入:5
如果我使用n则输出为10,但当我将--n替换为--n时,则返回正确的结果(15)。为什么不同?

最佳答案

令人惊讶的是,这个表情的行为

n + calculateSum(--n);

是未定义的,因为--n不仅在被减1后计算为n的值,还将n更改为新值。但是,相对于左侧的n(值计算)的另一个评估,该更改(副作用)是不排序的。根据C11 Appendix J.2.,当
标量对象上的副作用相对于同一标量对象上的不同副作用或使用同一标量对象的值进行的值计算是未排序的。
(6.5)中有更多的同类错误。
当你得到一个错误的值时,你可以认为自己是幸运的,因为你的编译器也可以生成返回“正确值”的代码…给定月亮的相位,优化设置,或者调用函数中的行数…

09-30 14:02