我如何“突破” if语句?[关闭]


75

我有一个if语句,我想“突破”。我知道中断只是为了循环。有人可以帮忙吗?

对于那些需要我尝试做的事的例子:

if( color == red )
{
...
if( car == hyundai ) break;
...
}

3
抱歉,没有人可以提供帮助。投票关闭。如果您不提供某些代码片段的细节,没人能帮忙
Nawaz

2
您能否提供一些示例代码?而且,根据情况,您可以尝试一个switch块;他们确实支持突破。
piebie 2011年

3
如果在函数中,则可以使用“返回”。
poitroae 2011年

3
您是否尝试过,goto尽管不建议这样做
Emmanuel N

2
我对此有一个简单的解决方法。使用do {} whie(false); 在if语句之外。这样做不需要修改代码,并且用户随时可以随时使用break语句。我想将其发布为答案,但该问题被标记为已关闭。
IAmSurajBobade

Answers:


71

嵌套的ifs:

if (condition)
{
    // half-massive amount of code here

    if (!breakOutCondition)
    {
        //half-massive amount of code here
    }
}

冒着被否决的危险-过去我曾发生过-我会提到,另一个(不受欢迎的)选择当然是可怕的goto;break语句只是变相的结果。

最后,我会回应一种普遍的看法,即可以改进您的设计,这样就不需要大量的if语句,更不用说打破它了。至少您应该能够提取两种方法并使用return:

if (condition)
{
    ExtractedMethod1();

    if (breakOutCondition)
        return;

    ExtractedMethod2();
}

8
将块重构为函数不仅可以提高可读性,而且还可以解决原始问题。
Mark B

绝对同意您的第二个观察。但是,我会说更好的方法是优化原始代码condition,并根据需要添加新代码,以便在满足条件时输入的代码块对应于OP原始想法中断之前应执行的代码。这将在您的例子只是调用一个方法,它可以再调用condition2condition3等需要的块。
马特·菲利普斯

9
goto如果由于可变范围的原因而您不能调用另一个函数,则是一个很好的解决方案。
edA-qa mort-ora-y

15
goto看起来好像在嵌套if之后嵌套了很多清理器。
亚当S

2
@AdamS基本上是这样-尤其是当您的字体大或代码编辑器窗口狭窄时。但是,goto与添加嵌套if语句相比,添加趋向于导致对例程进行推理的难度更加迅速地增加。因此,以一种复杂的方法,我可能会更喜欢易于理解控制流而不是清洁度。
phoog

42
if (test)
{
    ...
    goto jmp;
    ...
}
jmp:

哦,为什么不:)


1
哇...我在这个答案中闻到了些鬼话。当然,这并不是技术上的错误。
Yuck

20
@Yuck Nice相关的用户名。至于多方面的方面,但我要说的是,如果您的设计迫使您开始进入OP状态,那么使用goto不会使情况变得更糟。phoog也在他的获奖答案中指出,嵌套条件实际上只是表面上的不同。
马特·菲利普斯

有时您正在处理别人的臭代码,而您没有几个小时/天将其重构为理智的东西。
kayleeFrye_onDeck's

Goog,采用老式的方法,干净,不错的解决方案

1
goto的问题不在于最初的实现。在增强过程中,另一个开发人员在不知不觉中在if花括号和jmp:语句之间添加了一些语句。
Mandeep Singh,

23

您可能需要将if语句分解为较小的部分。话虽如此,您可以做两件事:

  • 将语句包装do {} while (false)并使用real break(不推荐!!!!!!!!)

  • 将语句放入自己的子例程中并使用return这可能是改进代码的第一步。


6
我已经看过所do/while使用的技术,我不一定会认为它很好用,并且避免了goto可能引入的问题(例如,尝试跳过变量初始化)
Nim

我同意这是比goto更好的解决方案。

@phoog,可能,但我不知道,这个问题被标记为C ++,在这里却没有...
Nim

@Nim ack,我怎么想念它?
phoog 2011年

+1,除了额外的缩进级别(无论如何都需要一半的代码以及可接受的答案),这可能是理想的-就像受控的goto,并且非常接近“按我的意思做”的东西
伊兹卡塔2011年

3

除非使用goto,否则无法中断if语句。

if (true)
{
      int var = 0;
      var++;
      if (var == 1)
          goto finished;
      var++;
}

finished:
printf("var = %d\n", var);

这将给出“ var = 1”作为输出


3

我不知道您的考试条件,但是一个好的老人switch可以工作

switch(colour)
{
  case red:
  {
    switch(car)
    { 
      case hyundai: 
      {
        break;
      }
      :
    }
    break;
  }
  :
}


2

您可以使用标签和goto,但这是一个糟糕的技巧。您应该考虑将if语句中的某些内容移至单独的方法。


2

||&&运营商都短路,因此,如果左侧||的计算结果为true或左侧&&的计算结果为假,则右侧不会进行评价。这相当于休息。


2

有一个标签在一个点上,你想跳并在侧面你如果使用goto语句

if(condition){
     if(jumpCondition) goto label
}
label:

1

您可以使用gotoreturn或致电abort ()exit ()等等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.