控制使用 while 循环到达非空函数 (c++) 的末尾

Control reaches end of non void function (c++) using while loop

本文关键字:c++ 函数 while 循环 控制      更新时间:2023-10-16

我已经研究过这个问题,但我仍然不清楚这个问题。所以,我有这个代码:

int is_negative(int a)
{
if(a < 0)
return a;
else while (a>=0)
{
cout << "Insert a negative value, please: ";
cin >> a;
if(a < 0)
return a;
}
}

在 main 函数中调用此函数是因为我希望用户输入负数,并且仅在负数时才存储该值。如果不是,我希望它循环,直到输入负数。

为什么我收到错误:"控制到达非空函数 [-Wreturn 类型]的末尾"?谢谢!:)

附言。我必须使用简单的语法,如 while 或 for 循环(练习需要这样做(。

问题是编译器无法检测到循环永远不会让执行流到达它后面,它不是那么聪明。另一方面,您可以写while( true )以避免混淆。

但最好的方法是将您的函数更改为:

int is_negative(int a)
{
while (a>=0)
{
cout << "Insert a negative value, please: ";
cin >> a;
}
return a;
}

它的作用完全相同,但更简单,更具可读性,并且不会再混淆编译器。

注意:您应该检查cin是否关闭并采取相应措施,否则您可能会进入无限循环

这只是一个警告,尽管您的编译器正在尽力而为,但您在这种特殊情况下已经超越了它。是的,永远不会达到最后一个大括号。

您有三种选择:

  1. 接受你很聪明,知道你在做什么。
  2. 在功能持续时间内关闭警告。
  3. 重构代码。一些软件公司不喜欢具有多个return的功能,这是有充分理由的。

如果我是你,我会丰满 3 岁。注意,如果a是一个double,那么如果a的输入值是NaN,则可以达到右大括号!

语句可访问性的科学是一门复杂的科学。有关更多阅读,请参阅 https://en.wikipedia.org/wiki/Halting_problem

我也无法抗拒在这里插入我的答案之一:此函数是否在所有控制路径上都有显式返回值?