【发布时间】:2014-04-19 17:54:26
【问题描述】:
我来自 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) 。这就是为什么在这种情况下最好不要使用预减量 *
【问题讨论】:
-
"n-- 不会将 n 减 1" - 不正确。下次验证你的假设。注意:它就像在 C 中一样工作。
-
鉴于最近的安全警报,您可能希望开始在 if 块周围使用 {}。另外,
using namespace std是错误的形式。 -
@AlexChamberlain 什么安全警报?
-
n*facto(n--)是未定义的行为。叮当说warning: unsequenced modification and access to 'n' -
@TomFenech:谷歌搜索“goto fail”,这是最近的一个例子。添加第二行很容易,但忘记添加大括号,最终会在不应该的情况下无条件地执行代码。 (在这种情况下,它会导致重要的安全检查被绕过。)
标签: c++ function recursion operator-keyword