繁体   English   中英

为什么此递归程序有效?

[英]why does this recursion program work?

#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的情况?

该程序依赖于未定义的行为。 当然不能保证它能正常工作,但是您可能会发现这样一种情况,您发送的参数(1)处于调用代码将其视为返回值的位置。 不要依赖此行为。

许多C ++编译器会因为存在语义问题而拒绝此代码: 并非所有控制路径都从fact()返回值

 int fact(int n); 

此函数签名返回一个整数,但是当给定n = 1时,您的实现中没有相应的return语句。 在那种情况下,该函数可能返回任何int值(即内存中的垃圾),并且该行为是undefined 即使编译器允许运行它,也不应依赖于此。

我很确定您在编译程序时看到了警告。 在我的环境中(在Mac OSX上为g ++),编译器发出以下警告:

警告:控制可能会达到非无效功能的结束[-Wreturn-type]

就个人而言,我认为编译器没有充分的理由允许这种错误(即,它应该无法编译)。

参考:以下是类似的问题:

没有返回语句的C ++返回值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM