Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数应该返回值问题_C++_Return Value_C++builder 5 - Fatal编程技术网

C++ 函数应该返回值问题

C++ 函数应该返回值问题,c++,return-value,c++builder-5,C++,Return Value,C++builder 5,给定这样一个函数 bool RequestStatus() { ... if (code == myCode) { return true; } else { return false; } } 为什么编译器会抱怨“函数应该返回值”。除非我遗漏了什么,否则它怎么可能不返回真或假呢?这是因为myCode的值依赖于运行时,因此编译器无法确定逻辑路径?如果写入返回(code==myCode)您将保存行,使编译器满意,并且通常以更C+

给定这样一个函数

bool RequestStatus()
{
    ...
    if (code == myCode) {
         return true;
    } else {
         return false;
    }
}

为什么编译器会抱怨“函数应该返回值”。除非我遗漏了什么,否则它怎么可能不返回真或假呢?这是因为myCode的值依赖于运行时,因此编译器无法确定逻辑路径?

如果写入
返回(code==myCode)您将保存行,使编译器满意,并且通常以更C++风格编写。

这样做会更优雅

bool RequestStatus()
{
    return code == myCode;
}

这可能会消除编译器消息/警告。

如果所有分支都有返回语句,则VC++和g++不会发出警告消息。我猜您的编译器(c++-builder-5)无法正确检查以确定所有分支上是否都有返回点。或者有另一个条件,你没有向我们展示,没有返回语句

bool RequestStatus()
{ 
   ...

   if (code == myCode) 
      return true;

   return false;
}

您可以简单地重构代码(可能与发布的代码类似),以获得一个返回点,从而避免对编译器发出警告。

我认为这是编译器的疑虑。您在嵌套范围内,编译器可能正在检查函数范围内的返回语句

在您的示例中:

bool RequestStatus()
{
    ...
    if (code == myCode) {
         return true;
    } else {
         return false;
    }
}
if
语句之后会发生什么?在函数末尾需要一个return语句,以便覆盖所有执行路径。您可以像这样重构代码:

bool RequestStatus()
{
    ...
    if (code == myCode) {
         return true;
    } 

    // else 
    return false;
}
甚至

return (code == myCode) ? true : false;
但另一个建议是

return ( code == myCode );

更干净。

主观上我同意海报上的说法,即应该将其重构为一个整洁的x==y返回语句,但是代码没有问题。这是您的编译器。

以下内容也可能会清除编译器消息/警告

bool RequestStatus()
{ 
   ...

   if (code == myCode) 
      return true;

   return false;
}

你的代码真的和你刚刚发布的代码片段一样简单吗

在Delphi(也是Borland/CodeGear/Embarcadero产品)中,我在一段wtf代码上遇到了相同的“问题”,这实际上是一个嵌套的ifs地狱:

if test1 then
  if test2 then
    if test3 then
      if test4 then
        if test5 
          then ...
          else ...
      else
        if test5 
          then ...
          else ...
    else
      if test4 then
        if test5 
          then ...
          else ...
      else
        if test5 
          then ...
          else ...
//etc...
(实际上有5个级别的嵌套ifs…)如果有太多可能的分支,编译器只会发送警告


如果您的代码位于
try/except
块中,并且有一个执行路径通过一个异常,而该异常不会初始化您的结果,则也会出现警告。

True,但这并不能回答问题。我不知道确切的编译器是什么,但为了避免错误,编译器必须用手指计算每一条可能的路径(if和if的else)是否都返回了什么。在任何条件之外找到一条线似乎都会更快乐。正如我所说的,重写成一行而没有if将使编译器更快乐。在SWE成熟两年后,我开始接受这一原则。您使用的编译器和平台是什么?C++builder-5 windows XP出于好奇,您使用的编译器是什么?我认为你的问题是量子概率。。很明显,有些东西可能是X,也可能不是X,但你无法处理X甚至不是所有存在事物的子集的可能性!哇,那是过去的爆炸。C++ Builder现在不是10岁吗?如果内存可用,那么它就有相当多的bug,最好由一个更新的编译器来为您服务。@Changeling:除了这个问题表明它坏了之外。。。或者至少是buggy。啊,但是如果逻辑1没有通过,那么逻辑2就会通过,那么为什么要在末尾放一个返回语句呢?好吧,在这种情况下,我想我们大多数人都会同意,在“if”语句(因此OP的问题…)之后没有任何事情发生。C++ Builder 5并没有穷尽地检查这些条件。(不像C#规范本身要求捕获它们!)。用C++ Builder避免这些警告并不总是容易的,因为编译器检查的内容取决于编译选项。修复调试版本中的警告,它有时会在发布版本中返回,反之亦然:-(感谢Brian-我最终重构了整个过程,现在好多了