【问题标题】:Program works when executed in C++ Tutor, but not anywhere else程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效
【发布时间】:2019-09-05 19:56:51
【问题描述】:

我正在编写一个遵循欧几里得算法的相当简单的程序(我们必须使用递归来编写它)。在C++ Tutor 中执行时效果非常好,但是当我在终端中编译程序时,它已经给了我:

警告:控制可能到达非空函数[-Wreturn-type]的末尾

当我尝试在终端中执行它时,它会抛出:

运行时错误:执行到了返回值函数的末尾,没有返回值

(但我要返回一个值?)

为什么它可以与 c++ 导师一起使用,但不能在 Linux 终端中使用(使用 clang 编译器)?

我试图在函数中使用一堆额外的变量来使过程对我来说更清晰,但我仍然不明白为什么它认为会出现我不会返回值的情况。

#include <iostream>

using namespace std;

int ggt(int a, int b){

    int rest{0};
    int zaehler{0};
    int divisor{0};

    if(a>=b){
        zaehler=a;
        divisor=b;

        if(a%b==0){
            return b;   
        }
        else{
            rest=a%b;
            divisor=rest;
            zaehler=b;

            ggt(zaehler, divisor);
        }
    }
    else{
        zaehler=b;
        divisor=a;

        if(b%a==0){
            return a;   
        }
        else{
            rest=b%a;
            divisor=rest;
            zaehler=a;

            ::durchlaeufe--;
            ggt(zaehler, divisor);

        }
    }
}

int main(){

int a{40}, b{12};

    cout << "Bitte Zaehler eingeben: ";
    cin >> a;
    cout << "\n";

    cout << "Bitte Nenner eingeben: ";
    cin >> b;
    cout << "\n";

    if(ggt(a, b)==0){
        cout << "ERROR\n";
    }
    else   {
    cout << "Der groesste gemeinsame Teiler ist: " << ggt(a, b) << "\n";
    }

    return 0;
}

在这个例子中,a=40 和 b=12,结果应该是 4。这正是 C++ 导师所说的......

【问题讨论】:

  • 在大多数分支中,ggt 不返回任何内容。在控制到达函数体末尾之前,return 需要 void 以外的类型的函数(并且不是 main)。编辑:您可能想同时将ggt(zaehler, divisor); 更改为return ggt(zaehler, divisor);
  • 天哪,谢谢,我不知道为什么我没有看到..
  • 不管怎样,在线 C++ 教程使用的编译器有时会做一些非常奇怪的事情。最好使用可以读取每个警告的编译器。我的猜测是 C++ Tutor 正在抑制或隐藏您的警告,并且您的代码依赖于未定义的行为。 Here 是另一个来自 C++ 教程的非常奇怪的编译器示例
  • 现在是启用所有编译器警告的好时机!任何一个都不应该被默默地忽略!

标签: c++


【解决方案1】:

实际答案(递归调用时缺少返回)已经给出。

我想添加一个更简单的版本供您比较,也许可以学到一些东西:)

int ggt(int a, int b)
{
    if (a < b)
    {
        std::swap(a, b);
    }

    if (a%b == 0)
    {
         return b;
    }

    return ggt(b, a%b);
 }

简短说明:

  • a
  • 调用递归时直接计算“rest”(a%b)(这样可以避免存储中间值)
  • 正如您所见,控制流程更简单,因此更容易推理执行的每个步骤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2011-08-01
    • 1970-01-01
    • 2019-10-27
    • 2011-03-21
    • 2017-05-23
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多