【问题标题】:getting control reaches end of non-void function from hcf function从 hcf 函数获取控制到达非 void 函数的末尾
【发布时间】:2020-07-09 11:59:20
【问题描述】:
int hcf (int a, int b) {
            int gcd;
    
            for (int i = 0; i <= a && i <= b; i++) {
                   if (a % i == 0 && b % i == 0) {
                   gcd = i;
                   return gcd;
                  }
            }
}

..\src\lcm-using-recursion.c:在函数“hcf”中: ..\src\lcm-using-recursion.c:41:1: 警告:控制到达非空函数的结尾 [-Wreturn-type]

           41 | }
              | ^

【问题讨论】:

  • 如果ab 是否定的怎么办?
  • 在某些情况下返回语句将无法到达 - 您需要在函数末尾添加一些内容
  • 最初 gcd=-1 而不是 return 你应该在循环内使用 break 并最终在函数结束时 retunr gcd

标签: c


【解决方案1】:

这个函数必须返回一些 int -- 这就是这里的编译器错误。

但是还有很多其他问题。

  • 根据定义,两个互质数的 gcd 为 1。如果 a 和 b 互质,则永远不会遇到 for 循环中的 return
  • 正如 tkausl 指出的那样,对于负 a 或 b 也永远不会遇到 for 循环中的返回
  • 即使循环运行,其中也存在错误。对于任何a&gt;=0b&gt;=0,当i = 1 时,您将返回1,因为a % 1 == 0 &amp;&amp; b % 1 == 0 始终为真。
int hcf (int a, int b) {
            int gcd;
    
            for (int i = 0; i <= a && i <= b; i++) {
                   if (a % i == 0 && b % i == 0) { /* <<< wrong <<< */
                   gcd = i;
                   return gcd;
                  }
            }

            // a and b have no common divisor
            return 1;
}

【讨论】:

    【解决方案2】:

    你创建的函数应该总是返回一个 int

    到达非空函数的末尾意味着具有未定义的行为

    这是一个有效的函数,如果没有找到它会返回 -1

    int hcf (int a, int b) { 
            int gcd;
    
            for (int i = 0; i <= a && i <= b; i++) {
                   if (a % i == 0 && b % i == 0) {
                   gcd = i;
                   return gcd;
                  }
            }
            return -1;
    }
    

    编辑:评论后的小改动

    【讨论】:

    • "到达非 void 函数的末尾意味着路径可能导致返回错误类型。" 并非如此 - 这意味着程序无效并且有未定义的行为。所以这个程序可能会炸毁你的烤面包机或以某种方式工作正常或任何可能的事情。
    猜你喜欢
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2012-11-12
    • 2018-10-23
    • 2022-01-25
    相关资源
    最近更新 更多