C++ 无需goto即可重构代码

C++ 无需goto即可重构代码,c++,refactoring,goto,C++,Refactoring,Goto,我有点困惑。如何在没有goto的情况下重构此语句 这样好吗 bool expressionFailed = false; if(first_expression) { if(second_expression) { // .... } else expressionsFailed = true; } else expressionsFailed = true; if(expressionsFailed) { //

我有点困惑。如何在没有goto的情况下重构此语句

这样好吗

bool expressionFailed = false;
if(first_expression)
{
    if(second_expression)
    {
        // ....
    }
    else
        expressionsFailed = true;
}
else
    expressionsFailed = true;

if(expressionsFailed)
{
    // ....
}

我不能使用&,因为当second_expression=false时,需要执行iffirst_expression后面的代码,您可以按如下方式重写它:

if(first_expression)
{
    // ....
    if(second_expression)
    {
        // ....
    }
}
if(!first_expression || (first_expression && !second_expression))
{
}

您可以按如下方式重写它:

if(first_expression)
{
    // ....
    if(second_expression)
    {
        // ....
    }
}
if(!first_expression || (first_expression && !second_expression))
{
}

我对您的代码一无所知,但您可以这样做:

void on_error ()
{
  //error stuff
}

int main ()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            on_error();
    }
    else
        on_error();
}
或者更好:

void job()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            throw;
    }
    else
        throw;
}

int main () {
  try
  {
    job();
  }
  catch ()
  {
    // err stuff 
  }
  return 0;
}

我对您的代码一无所知,但您可以这样做:

void on_error ()
{
  //error stuff
}

int main ()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            on_error();
    }
    else
        on_error();
}
或者更好:

void job()
{
    if(first_expression)
    {
        if(second_expression)
        {
            // ....
        }
        else
            throw;
    }
    else
        throw;
}

int main () {
  try
  {
    job();
  }
  catch ()
  {
    // err stuff 
  }
  return 0;
}

你在正确的轨道上。我会简化为:

bool succeeded = false;
if(first_expression)
{
    if(second_expression)
    {
       succeeded = true;
       // ....
    }
}

if(!succeeded)
{
   // ....
}

你在正确的轨道上。我会简化为:

bool succeeded = false;
if(first_expression)
{
    if(second_expression)
    {
       succeeded = true;
       // ....
    }
}

if(!succeeded)
{
   // ....
}

是的,看起来不错。你写的代码是fineUse break而不是goto。是的,看起来不错。你写的代码是fineUse break而不是goto。这对我来说是最好的例子。这对我来说是最好的例子