#include <iostream>
using namespace std;
int main() {
int n,x;
int fact(int);
cin >> n;
x = fact(n);
cout << x;
return 0;
}
int fact(int n) {
if(n!=1)
return n*fact(n-1);
}
在最后一种情况下,当传递给函数fact的参数为1时,如果我在代码中没有指定它,它如何计算fact(1)
等于1?
答案 0 :(得分:10)
此程序依赖于未定义的行为。它肯定不能保证工作,但您可能已经发现了一个情况,即您发送的参数(1)位于调用代码将其视为返回值的位置。 不依赖于此行为。
许多C ++编译器会拒绝此代码,因为它存在语义问题:并非所有控制路径都返回 fact()
中的值答案 1 :(得分:2)
int fact(int n);
此函数签名返回一个整数,但是当给出n = 1时,实现中没有相应的return语句。在这种情况下,函数可能返回任何int
值(即内存中的垃圾),行为未定义。您不应该依赖于此,即使您的编译器允许它运行。
我很确定您在编译程序时看到了警告。在我的环境中(Mac OSX上的g ++),编译器发出以下警告:
警告:控制可能会达到非空函数的结束[-Wreturn-type]
就个人而言,我认为编译器没有任何理由允许这种错误(即它应该无法编译)。
参考:类似的问题如下: