程序在 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 应用程序运行时无效