C++ 递归缺陷—;这个代码哪里出错了?

C++ 递归缺陷—;这个代码哪里出错了?,c++,C++,我正在尝试对整数求和,但我不知道这段代码中的漏洞在哪里 只要告诉我这段代码中的漏洞在哪里,不要给出其他方法来解决这个问题 输出应该是6,但代码给出了4 int SUM(int n) { cout<<n<<endl; if(n!=1) return n + SUM(--n); return n; } int main() { cout<<SUM(3)<<endl; } int和(int n

我正在尝试对整数求和,但我不知道这段代码中的漏洞在哪里 只要告诉我这段代码中的漏洞在哪里,不要给出其他方法来解决这个问题

输出应该是6,但代码给出了4

int SUM(int n) { 
    cout<<n<<endl; 

    if(n!=1) 
    return n + SUM(--n); 

    return n; 
}
int main() { 

    cout<<SUM(3)<<endl;

}
int和(int n){
库特
我相信缺陷就在上面这一行。递减n可能不是您想要做的;更可能是您想要做的:

return n + SUM(n-1); 

返回n+和(--n)
非常可疑,因为您引用的是n,但在同一表达式中的其他地方对它进行了变异。它的排序可能与您预期的不同。为什么要减量而不是只传递
n-1
作为参数?您有一个编写的计算顺序问题-计算方式未定义,但decrement可能发生在加法的LHS上的
n
被计算之前,导致您看到的结果。但是找到阶乘相同的方法很好,运气不好!未定义的行为是未定义的,未定义的行为可能工作的方式之一是“按预期”。有时它不按预期工作。不要使用undefined行为。请注意,您也从Jeremy Friesner那里得到了答案,user1937198也指出了相同的问题。详细说明,编译器无法保证
--n
操作发生在
n+和(…)之后
操作。因此,这样一个外观简单的表达式会导致未定义的行为。如果在此行之前n=3,则可以返回
3+SUM(2)
2+SUM(2)
。有趣的因素之一是,在对函数和函数指示符的参数求值之后有一个序列点(以及函数返回之前的另一个),并且通常在其周围有一个序列点会修复未定义的行为。但是,在这种情况下,它不能保证表达式的LHS或RHS是否首先求值,以及if(似乎是这样的情况)首先评估RHS,然后在评估LHS之前减小
n
。(另请参阅)
return n + SUM(n-1);