【发布时间】: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++