鱼C论坛

 找回密码
 立即注册
查看: 398|回复: 3

[已解决]关于函数返回值警告的问题,怎样消除这个警告?

[复制链接]
发表于 2023-12-28 22:16:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的select函数的第34行会有警告:control reaches end of non-void function [-Wreturn-type]。怎样可以避免这个警告呢?
  1. #include <stdio.h>

  2. typedef int (*PTR_TO_FUN)(int, int);

  3. int add(int, int);
  4. int sub(int, int);
  5. int calculate(PTR_TO_FUN, int, int);
  6. PTR_TO_FUN select(char);

  7. int add(int x, int y)
  8. {
  9.     return x + y;
  10. }

  11. int sub(int x, int y)
  12. {
  13.     return x - y;
  14. }

  15. int calculate(PTR_TO_FUN fun, int x, int y)
  16. {
  17.     return fun(x, y);
  18. }

  19. int (*select(char ch))(int, int)
  20. {
  21.     switch (ch)
  22.     {
  23.     case '+':
  24.         return add;
  25.     case '-':
  26.         return sub;
  27.     }
  28. }

  29. int main(void)
  30. {
  31.     int num1, num2;
  32.     char op;
  33.     PTR_TO_FUN fp;
  34.     printf("请输入一个式子(如:1+2):");
  35.     scanf("%d%c%d", &num1, &op, &num2);
  36.     fp = select(op);
  37.     printf("%d %c %d = %d", num1, op, num2, calculate(fp, num1, num2));

  38.     return 0;
  39. }
复制代码
最佳答案
2023-12-28 22:20:15
hanghanga 发表于 2023-12-28 22:20
可是这样的话,一旦输入的不是+或-号,就会导致程序直 ...

如果输入的不是"+"或"-",我们可以在`select`函数中设置一个默认的处理逻辑。例如,你可以返回一个空函数,即一个什么都不做的函数,这样程序就可以继续执行而不会停止。为了实现这个逻辑,我们可以定义一个空函数`empty`,并将其作为默认情况下的返回值。然后在`calculate`函数中,我们可以加入一个判断,如果函数指针为空,则返回0,这样就不会出现异常情况了。以下是修改后的代码:
  1. #include <stdio.h>
  2. typedef int (*PTR_TO_FUN)(int, int);
  3. int add(int, int);
  4. int sub(int, int);
  5. int calculate(PTR_TO_FUN, int, int);
  6. PTR_TO_FUN select(char);
  7. int add(int x, int y){
  8.     return x + y;
  9. }
  10. int sub(int x, int y){
  11.     return x - y;
  12. }
  13. int calculate(PTR_TO_FUN fun, int x, int y){
  14.     if (fun != NULL) {
  15.         return fun(x, y);
  16.     } else {
  17.         printf("输入了无效的操作符!\n");
  18.         return 0;
  19.     }
  20. }
  21. PTR_TO_FUN select(char ch){
  22.     switch (ch){
  23.         case '+':
  24.             return add;
  25.         case '-':
  26.             return sub;
  27.         default:
  28.             printf("输入了无效的操作符!\n");
  29.             return NULL;
  30.     }
  31. }
  32. int main(void){
  33.     int num1, num2;
  34.     char op;
  35.     PTR_TO_FUN fp;
  36.     printf("请输入一个式子(如:1+2):");
  37.     scanf("%d%c%d", &num1, &op, &num2);
  38.     fp = select(op);
  39.     printf("%d %c %d = %d\n", num1, op, num2, calculate(fp, num1, num2));
  40.     return 0;
  41. }
复制代码

现在,当输入了无效的操作符时,程序会打印出相应的提示信息,并返回0。这样就避免了程序直接停止的情况。请注意,在输入了无效操作符时,输出的结果值为0,这是因为我们在`calculate`函数中设置的默认返回值。你也可以根据实际需求对这部分逻辑进行修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-28 22:16:22 | 显示全部楼层
这个警告的原因是函数`select`中的`switch`语句没有覆盖所有的情况,导致函数在某些分支上没有返回值。为了消除警告,你可以在`switch`语句最后添加一个默认的情况,即`default`分支,返回一个默认的函数指针。
  1. int (*select(char ch))(int, int)
  2. {
  3.     switch (ch)
  4.     {
  5.     case '+':
  6.         return add;
  7.     case '-':
  8.         return sub;
  9.     default:
  10.         return NULL;  // 返回一个默认的函数指针
  11.     }
  12. }
复制代码

这样做可以保证`select`函数在所有情况下都能返回一个合法的函数指针,从而消除警告。当然,如果你对默认情况有其他的处理逻辑,你也可以根据实际需求进行相应的修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-28 22:20:02 | 显示全部楼层
FishC 发表于 2023-12-28 22:16
这个警告的原因是函数`select`中的`switch`语句没有覆盖所有的情况,导致函数在某些分支上没有返回值。为了 ...

可是这样的话,一旦输入的不是+或-号,就会导致程序直接停止了。该怎样改进呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-28 22:20:15 | 显示全部楼层    本楼为最佳答案   
hanghanga 发表于 2023-12-28 22:20
可是这样的话,一旦输入的不是+或-号,就会导致程序直 ...

如果输入的不是"+"或"-",我们可以在`select`函数中设置一个默认的处理逻辑。例如,你可以返回一个空函数,即一个什么都不做的函数,这样程序就可以继续执行而不会停止。为了实现这个逻辑,我们可以定义一个空函数`empty`,并将其作为默认情况下的返回值。然后在`calculate`函数中,我们可以加入一个判断,如果函数指针为空,则返回0,这样就不会出现异常情况了。以下是修改后的代码:
  1. #include <stdio.h>
  2. typedef int (*PTR_TO_FUN)(int, int);
  3. int add(int, int);
  4. int sub(int, int);
  5. int calculate(PTR_TO_FUN, int, int);
  6. PTR_TO_FUN select(char);
  7. int add(int x, int y){
  8.     return x + y;
  9. }
  10. int sub(int x, int y){
  11.     return x - y;
  12. }
  13. int calculate(PTR_TO_FUN fun, int x, int y){
  14.     if (fun != NULL) {
  15.         return fun(x, y);
  16.     } else {
  17.         printf("输入了无效的操作符!\n");
  18.         return 0;
  19.     }
  20. }
  21. PTR_TO_FUN select(char ch){
  22.     switch (ch){
  23.         case '+':
  24.             return add;
  25.         case '-':
  26.             return sub;
  27.         default:
  28.             printf("输入了无效的操作符!\n");
  29.             return NULL;
  30.     }
  31. }
  32. int main(void){
  33.     int num1, num2;
  34.     char op;
  35.     PTR_TO_FUN fp;
  36.     printf("请输入一个式子(如:1+2):");
  37.     scanf("%d%c%d", &num1, &op, &num2);
  38.     fp = select(op);
  39.     printf("%d %c %d = %d\n", num1, op, num2, calculate(fp, num1, num2));
  40.     return 0;
  41. }
复制代码

现在,当输入了无效的操作符时,程序会打印出相应的提示信息,并返回0。这样就避免了程序直接停止的情况。请注意,在输入了无效操作符时,输出的结果值为0,这是因为我们在`calculate`函数中设置的默认返回值。你也可以根据实际需求对这部分逻辑进行修改。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 19:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表