【问题标题】:Compiler Warning: Execution reaches the end of a value-returning function without returning a value编译器警告:执行到达返回值函数的末尾而不返回值
【发布时间】:2020-10-23 11:56:26
【问题描述】:

给我的任务是:

约翰有一些钱,他想在第 1 年初存入银行 (f0)。他想每年提取一笔钱来维持生计c0

这是他的银行家计划:

首先,在第 1 年年初存入f0 个单位的钱。

由于他的银行账户的年利率为p%, 约翰每年可以随时提取c0 单位的钱。但是,他必须考虑到每年i% 的通货膨胀,以保持他的生活质量。 i 的值应该多年来保持不变。

我计算和更新约翰银行账户的解决方案:

class BankerPlan{
public:
    static bool fortune(int f0, double p, int c0, int n, double i){
        if(f0 > 0){
            if(n == 0){
                return true;
            }
            else{
                fortune(f0 + (f0 * p / 100) - c0 , p , c0 + (c0 * i / 100) , n - 1, i);
            }
        }
        else{
            return false;
        }
   }
};

我从我的编译器收到此警告:

 warning: control may reach end of non-void function [-Wreturn-type]

1 warning generated.

 runtime error: execution reached the end of a value-returning function without returning a value

谁能告诉我为什么会发生这种情况,以及将来如何防止它发生?

【问题讨论】:

  • 也许你的意思是return fortune(f0 + (f0 * p / 100) - c0 , p , c0 + (c0 * i / 100) , n - 1, i);
  • 提示:如果你的if 的一个分支有一个强制的return,你就不需要else
  • @tadman 在这种情况下,我认为删除第二个else 将摆脱警告,但逻辑仍然是错误的。
  • @cigien 删除else 绝对没有效果。该代码仅在if 尚未触发return 时才会运行。它基本上是无缘无故地包装和缩进的。第一个if 也应该重写为保护子句,如if (f0 <= 0) { return false; },这意味着其余部分也可以取消缩进,从而简化结构。
  • ⟼通过采用indentation style 并一致地应用它,这段代码可以受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间来破译它,而且它还可以使错误更加明显,因为它们在视觉上很突出。

标签: c++ c++17


【解决方案1】:

您收到编译器警告是因为程序已成功退出您的函数而不返回值,即使您的函数的返回类型为 bool

在代码的line 11 上,您输入fortune(f0 + (f0 * p / 100) - c0 , p , c0 + (c0 * i / 100) , n - 1, i),这实际上并没有做任何事情,因为您调用它时根本没有处理返回的值。要解决此问题,请在行首添加 return

static bool fortune(int f0, double p, int c0, int n, double i){
    if(f0 > 0){
        if(n == 0){
            return true;
        }
        else{
            return fortune(f0 + (f0 * p / 100) - c0 , p , c0 + (c0 * i / 100) , n - 1, i);
        }
    }
    else{
        return false;
    }
}

另请注意,当您有一个 if-else 并且一个分支有一个 return 时,您可以省略 else

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2014-03-19
    • 2011-09-28
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2021-12-06
    相关资源
    最近更新 更多