如何在不使用goto的情况下从if块跳转到else块?

时间:2019-06-04 11:26:29

标签: c++ if-statement

我正在编写一个代码,其中在if块中完成了一些处理。但是如果处理结果不是预期的,我想执行else块。

if(condition1)
{
// Some processing
   if(another condition)
        //Do some task;
   else 
        //Execute else of outer block;
}
else
{
}

4 个答案:

答案 0 :(得分:8)

您可以通过重写if条件来做到这一点:

if (condition1) {
    // Some processing
}

if (condition1 && another condition) {
    // Do some task;
} else {
   // Execute else of outer block;
}

答案 1 :(得分:4)

固然值得认真考虑反对这种构造的警告,但可以使用带有全文的switch语句以结构化的方式完成您所要求的事情。

例如:

switch(condition1)
{
    case true:
        // some processing
        if(condition2)
        {
            // Do some task;
            break;
        }
        [[fallthrough]]; // or just comment: fallthru if not using c++17
    case false:
        // execute else of outer block;
}

答案 2 :(得分:2)

您可以依靠&&短路属性和表达式分隔符运算符 ,来编写

if (condition1 && (some processing, another condition)){
    // Do some task
} else {
    // The outer block
}

仅在some processinganother condition的情况下评估condition1true

这样做的好处是condition1仅被评估一次,如果有副作用,这很有用。

它也很简洁,但是如果some processing不是一个简单的表达式,那么它实际上是不可行的(如果是一个函数调用,它会很好地工作)。

答案 3 :(得分:0)

添加到现有答案中的另一种技术:

bool skip_X = false;
if (condition1)
{
    // Some processing
    if (another condition)
    {
        //Do some task;
        skip_X = true;
    }
}
if (!skip_X)
    ....

这避免了对 condition1 进行两次评估,这可能会产生问题,或者如果表达式中的值可以通过在if或其他线程中进行处理而更改,则可能会出现问题。


说...

  

如何在不使用goto的情况下从if块跳转到else块?

该语言之所以具有goto是有原因的,并且-就像那些说“我的构造函数如何在不引发异常的情况下报告错误” 的人一样-通过人为地限制自己使用语言功能显然最适合您的需求,您可以创建更差的代码。