C++ 多个返回语句或“a”;转到终点&引用;

C++ 多个返回语句或“a”;转到终点&引用;,c++,coding-style,return,goto,C++,Coding Style,Return,Goto,什么是更好的样式/可读性 我有一个循环,它读取输入并根据输入执行不同的操作,当出现错误时,我需要一个简单的返回。例如: while( get_input() ) { if( input == "somethingcool" ) { if( !process_somethingcool() ) return; // <-- a couple of these } //... else // bad input,

什么是更好的样式/可读性

我有一个循环,它读取输入并根据输入执行不同的操作,当出现错误时,我需要一个简单的
返回。例如:

while( get_input() )
{
    if( input == "somethingcool" )
    {
        if( !process_somethingcool() )
            return; // <-- a couple of these
    }
    //...
    else // bad input, error handling is fancier than this, but irrelevant to the question
        return;
}
return;
while(获取输入()
{
如果(输入==“somethingcool”)
{
如果(!process_somethingcool())

return;//IMHO使用多次返回而不使用goto。使用goto的人也会激怒狗。

IMHO使用多次返回而不使用goto。使用goto的人也会激怒狗。

goto End;
很好,部分原因在于可读性,但也因为如果你后来意识到有些事情需要发生例如,在关闭函数、释放内存或释放资源之前,您可以集中该进程,而不是复制粘贴它。

转到结尾;
之所以好,部分原因是因为可读性,但也因为如果您以后意识到在关闭函数、释放内存或释放资源之前需要发生一些事情例如,您可以集中化该进程,而不是复制粘贴它。

样式和可读性会导致我使用异常来处理错误条件。调用方如何知道您的方法是否被正确调用


也就是说:
goto
不应该用于此;
return
是更好的选择。如果在例程结束时需要执行任何操作,不管它退出的原因是什么,那么您应该抛出异常并使用
catch
块。

样式和可读性将导致我使用异常来处理错误条件您的调用者如何知道您的方法是否被正确调用


这就是说:
goto
不应该用于此;
return
是更好的选择。如果在例程结束时需要做任何事情,不管它为什么退出,那么你应该抛出异常并使用
catch
块。

return
通常比
goto
更可取;通常,det标签的批评者无法拿出任何实际的论据来支持他们的教条。1

然而,您的情况更为明确:为什么选择
goto
?这两种解决方案都是等效的,不同的是
goto
要求您在函数结束之前编写
end:
,这会占用空间,而且毫无理由看起来很难看

因此,在给出的两个选项中,我建议使用
return
s。也就是说,我还建议认真考虑回答这个问题时给出的其他建议(例外情况,并限制条件的“嵌套性”)



1或者,如果他们这样做,通常是“转到”
goto
让您的对象挂起”,这是不正确的(根据中的6.6/2).
goto
不会破坏RAII模型。

return
通常优于
goto
;通常,标签的批评者无法拿出任何实际的论据来支持他们的教条。1

然而,您的情况更为明确:为什么选择
goto
?这两种解决方案都是等效的,不同的是
goto
要求您在函数结束之前编写
end:
,这会占用空间,而且毫无理由看起来很难看

因此,在给出的两个选项中,我建议使用
return
s。也就是说,我还建议认真考虑回答这个问题时给出的其他建议(例外情况,并限制条件的“嵌套性”)



1或者,如果他们这样做,通常是“转到”
goto
让您的对象挂起”,这是不正确的(根据中的6.6/2).
goto
不会破坏RAII模型。

实际上,不建议使用
goto
。它会在代码可读性方面产生问题。最好在希望离开循环并在代码末尾返回的地方使用
break;
语句。这是标准过程

while( get_input() )
{
    if( input == "somethingcool" )
    {
        if( !process_somethingcool() )
            break; // <-- a couple of these
    }
    //...
    else // bad input, error handling is fancier than this, but irrelevant to the question
        break; //although its better if you handle it somehow here.
}
return;
while(获取输入()
{
如果(输入==“somethingcool”)
{
如果(!process_somethingcool())

break;//实际上,不建议使用
goto
。它会在代码的可读性方面产生问题。最好使用
break;
语句,在其中您希望离开循环并在代码末尾返回。这是标准过程

while( get_input() )
{
    if( input == "somethingcool" )
    {
        if( !process_somethingcool() )
            break; // <-- a couple of these
    }
    //...
    else // bad input, error handling is fancier than this, but irrelevant to the question
        break; //although its better if you handle it somehow here.
}
return;
while(获取输入()
{
如果(输入==“somethingcool”)
{
如果(!process_somethingcool())

Burn;//

多个返回语句实际上是好的样式,几乎总是产生比试图返回单个点更干净的代码。GOTOS在C++中是无用的(除了它们的其他问题)。他们不能跳过初始化,这可能迫使你从他们的使用点开始初始化事物,这也是坏的风格。

< P>多个返回语句实际上是好的样式,几乎总是产生比试图返回一个返回点更干净的代码。C++中的GOTOS是非常无用的(除了它们的其他问题)。它们不能跳过初始化,这可能会迫使您从它们的使用点开始初始化,这也是一种糟糕的风格。

对于C,goto是合理的(它在Linux内核中广泛使用),因为您可以通过单点返回来增强可读性

C++,因为你有可能抛出任何异常,所以隐式地有多个返回点,所以你应该总是使用具有多个返回的RAII模型。

< P> C,GOTO是合理的(它在Linux内核中被广泛使用),因为你可以用单个返回点增强可读性。

C++,因为你有可能抛出任何异常,所以隐式地有多个返回点,所以你应该总是使用具有多个返回的RAII模型。

while( get_input() )
{
    if( input != "somethingcool" )
    {
        return; //handle error
    }
    if( !process_somethingcool() )
        return; //handle error
    }
}
return; //success
void f()
{
   bool bDone=false;
   while (!bDone && get_input())
   {
      if (input == "cool")
      {
         process_cool();
         bDone = true;
      }
      else if (input == "unfinished")
      {
         process_something();
      }
      else
      {
          // error
          bDone = true;
      }
   }
}