【发布时间】: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 并一致地应用它,这段代码可以受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间来破译它,而且它还可以使错误更加明显,因为它们在视觉上很突出。