程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效

Posted

技术标签:

【中文标题】程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效【英文标题】:Program works when executed in C++ Tutor, but not anywhere else 【发布时间】: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 rest0;
    int zaehler0;
    int divisor0;

    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 a40, b12;

    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); Error: control may reach end of non-void function in C的可能重复 天哪,谢谢,我不知道为什么我没有看到.. 不管怎样,在线 C++ 教程使用的编译器有时会做一些非常奇怪的事情。最好使用可以读取每个警告的编译器。我的猜测是 C++ Tutor 正在抑制或隐藏您的警告,并且您的代码依赖于未定义的行为。 Here 是另一个来自 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)(这样可以避免存储中间值) 正如您所见,控制流程更简单,因此更容易推理执行的每个步骤。

【讨论】:

以上是关于程序在 C++ Tutor 中执行时有效,但在其他任何地方都无效的主要内容,如果未能解决你的问题,请参考以下文章

当我在 WinForms 应用程序上使用 DefaultProxy 时有效,但在 WCF 中无效?

PHP 需要“guzzle.phar”会引发致命错误,但在页面刷新时有效

PowerShell 代码在从 PowerShell 命令提示符运行时有效,但在双击运行或转换为可执行文件时无效

NSFileManager 在 Xcode 中作为发行版构建时有效,但在作为独立 OS X Cocoa 应用程序运行时无效

JS 代码在我将其粘贴到控制台时有效,但在我的 React 应用程序中不起作用

AsyncTask(update) 仅在应用程序第一次打开时有效,但在 5 秒后不更新