我来自C语言背景,现在我正在使用C++学习OOP

下面是一个计算阶乘的程序。

#include <iostream>

using namespace std;

void main ()
{
    char dummy;
    _int16 numb;
    cout << "Enter a number: ";
    cin >> numb;

    double facto(_int16);

    cout << "factorial = " <<facto(numb);
    cin >> dummy;
}

double facto( _int16 n )
{
    if ( n>1 )
        return ( n*facto(n-1) );
    else
        return 1;
}

上面的代码工作正常。

但是如果我替换return语句
    return ( n*facto(n-1) );

有了这个
    return ( n*facto(n--) );

那就行不通了 n-- 不会将n减1。为什么?

我正在使用Visual Studio 2012

编辑:知道了!谢谢:)
*此外,我想补充以下答案:使用--n将导致n在执行语句之前递减。因此,由于递减,该表达式将变为(n-1)*facto(n-1)。这就是为什么在这种情况下最好不要使用减量*

最佳答案

编辑:: 下面的解释只是为了阐明运算符(operator)对Post和Pre-Decrement的用法,以便更好地理解它们。 OP的代码的正确答案是 n*facto(n - 1)。 @OP:您不应在代码的该部分中进行任何递减操作,因为由于对n变量的无序修改,它会调用未定义的行为。

减前和减后::
如果要在传递值之前递减变量,则必须使用预递减(wiki-link)。另一方面,后减量在变量减量之前对表达式进行求值:

int n = 10, x;
x = --n;                // both are 9


int n = 10, x;
x = n--;                // x = 10, i = 9

为什么在您的情况下不使用递减?
为什么?







这意味着,在两个序列点之间,变量不得被多次修改,并且,如果将对象写入完整表达式中,则在同一表达式中对它的任何和所有访问都必须直接参与值的计算被写。

09-26 16:16