我是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 ( n*facto(n-1) );
有了这个
return ( n*facto(n--) );
那就不行了。 n-- 不会将 n 减 1。为什么?
我正在使用 Visual Studio 2012
编辑:知道了!谢谢 :)
*此外,我想补充以下答案:使用 --n 将导致 n
在语句执行前递减。因此,由于预递减,表达式将变为 (n-1)*facto(n-1)
。这就是为什么在这种情况下最好不要使用预递减 *
最佳答案
目前,通过使用 n--
,您将 n
的原始值(因此未修改值)传递给 facto
,这会导致循环。
您需要改用n - 1
。从表面上看,使用 --n
会很诱人,因为这会减少 n
并评估为新的(较低的)值。但是 --n
会给你未定义的行为,因为你将函数返回值预乘以 n
并且因为 *
不是序列点,n
的值未明确定义。
(顺便说一下,C 中的行为是相同的)。
[编辑:感谢 Mike Seymour 关于未定义行为的观点]。
关于c++ - C++ 中的自减运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22405031/