关于控件到达非 void 函数末尾的编译器错误

Compiler error about control reaches end of non void function

提问人:Shashaank 提问时间:11/15/2023 最后编辑:UpAndAdamShashaank 更新时间:11/15/2023 访问量:88

问:

我在编译代码时遇到编译器错误。

问题在于从用户那里找到每个固定数量的数字的最大质因数

我得到的错误 -

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;
}
C 编译器错误

评论

0赞 Shashaank 11/15/2023
为什么会投反对票,请告诉我原因!

答:

2赞 UpAndAdam 11/15/2023 #1

问题恰恰在于编译器错误所说的问题是什么;在函数中,你没有在所有路径中都有返回值,并且由于返回值由调用函数使用,因此所有路径都必须有一个返回值(感谢@EricPostpischil指出了正确的标准规则)。在一种情况下,您以递归方式调用,并且在递归完成时没有返回值。在另一条路径中,您返回 .您需要在所有途径中返回。largest_prime_factorifa

更直观地:

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 分支,则不会返回任何内容,并且其完全编译器定义了会发生什么,编译器可以优化整个事情。