提问人:Shashaank 提问时间:11/15/2023 最后编辑:UpAndAdamShashaank 更新时间:11/15/2023 访问量:88
关于控件到达非 void 函数末尾的编译器错误
Compiler error about control reaches end of non void function
问:
我在编译代码时遇到编译器错误。
问题在于从用户那里找到每个固定数量的数字的最大质因数
我得到的错误 -
Solution.c: In function ‘largest_prime_factor’:
Solution.c:35:1: error: control reaches end of non-void function [-Werror=return-type]
}
^
cc1: some warnings being treated as errors
我的代码
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int largest_prime_factor(int a);
int check_prime(int b);
int main() {
int t;
scanf("%d", &t);
for (int a0 = 0; a0 < t; a0++) {
long n;
scanf("%ld", &n);
printf("%d\n", largest_prime_factor(n));
}
return 0;
}
int largest_prime_factor(int a) {
if (check_prime(a) != 1) {
for (int i = a - 1; i > 1; i--) {
if (a % i == 0) {
a = i;
}
}
largest_prime_factor(a);
}
else {
return a;
}
}
int check_prime(int b) {
int s = (int)sqrt(b);
for (int i = 2; i <= s; i++) {
if (b % i == 0) {
return 0;
}
}
return 1;
}
答:
2赞
UpAndAdam
11/15/2023
#1
问题恰恰在于编译器错误所说的问题是什么;在函数中,你没有在所有路径中都有返回值,并且由于返回值由调用函数使用,因此所有路径都必须有一个返回值(感谢@EricPostpischil指出了正确的标准规则)。在一种情况下,您以递归方式调用,并且在递归完成时没有返回值。在另一条路径中,您返回 .您需要在所有途径中返回。largest_prime_factor
if
a
更直观地:
int largest_prime_factor(int a) {
if (check_prime(a) != 1) {
for (int i = a - 1; i > 1; i--) {
if (a % i == 0) {
a = i;
}
}
largest_prime_factor(a);
// You need to return something here perhaps return largest_prime_factor(a)
}
else {
return a;
}
}
评论
1赞
UpAndAdam
11/15/2023
确定。但我试图让他想办法解决这个问题:-)
1赞
UpAndAdam
11/15/2023
你希望从中吸取的教训是,在你提交代码之前,你应该尝试运行它并测试它。如果你在提交之前做了这些事情中的任何一件,你可能会发现你的代码有很大问题,可以自己修复它,这将有助于你作为一个程序员的进步。
1赞
ikegami
11/15/2023
@Shashaank,关于“为什么我没有在其他编译器中收到任何警告或错误?”,警告大多是特定于编译器的。也许其他编译器对此没有警告,或者您没有要求对此发出警告。
1赞
Eric Postpischil
11/15/2023
@UpAndAdam:回复“......C 语言的规则。通过函数的每个路径都必须有一个非 void 返回“:C 标准不要求通过具有非 void 返回类型的函数的每个路径都返回一个值。只有当函数返回而不返回值(通过流动到其关闭)并且调用函数尝试使用返回值(OP 的程序这样做,因此他们需要 ,但不是每个程序都这样做)时,C 标准才定义该行为。}
return
1赞
UpAndAdam
11/15/2023
在我进行编辑以删除有关提交的不重要信息之前,@EricPostpischil阅读了这篇文章。最初它说我已经将这个提交给了 HackerRank。测试会发现一个错误,因为如果他们采用了 if 分支,则不会返回任何内容,并且其完全编译器定义了会发生什么,编译器可以优化整个事情。
评论