2011-12-15 13 views
51

Tengo una declaración if de la que quiero "romper". Entiendo que la ruptura solo es realmente para bucles. ¿Alguien puede ayudar?¿Cómo me "rompo" de una declaración if?

Para aquellos que requieren un ejemplo de lo que estoy tratando de hacer:

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

Lo siento, nadie puede ayudar. Votado por cerca. Nadie puede ayudarnos si no nos da algunos detalles con algún fragmento de código – Nawaz

+0

Muestra el código que representa lo que estás tratando de hacer. –

+2

¿Puedes dar un poco de código de muestra? Y dependiendo de la situación, podrías probar un bloque 'switch' en su lugar; ellos apoyan romperse. – piebie

Respuesta

54

ifs anidados:

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

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

A riesgo de ser downvoted - que me ha pasado en el pasado - mencionaré que otra opción (impopular) sería, por supuesto, la temida goto; una declaración de break es solo un goto disfrazado.

Y, por último, me hago eco del sentimiento común de que su diseño probablemente podría mejorarse para que la declaración masiva de if no sea necesaria, y mucho menos salir de ella. Por lo menos debe ser capaz de extraer un par de métodos, y utilizar un retorno:

if (condition) 
{ 
    ExtractedMethod1(); 

    if (breakOutCondition) 
     return; 

    ExtractedMethod2(); 
} 
+4

Refactorear trozos en funciones no solo ayudará a la legibilidad sino que también resolverá el problema original. –

+0

Definitivamente de acuerdo con su segunda observación. Sin embargo, diría que la mejor ruta sería refinar la 'condición 'original, y agregar nuevas según sea necesario, de modo que el bloque de código que se ingresa cuando se satisface corresponde a lo que se debe ejecutar * antes de * la interrupción en OP's idea original. Esto, como en su ejemplo, simplemente invocaría un método, que luego podría llamarse en los bloques 'condition2',' condition3', etc., según sea necesario. –

+6

'goto' es una buena solución si por razones de alcance variable no puede llamar a otra función. –

2

Puede usar una etiqueta y goto, pero este es un hack incorrecto. Debería considerar mover algunas de las cosas en su declaración if para separar los métodos.

1

Puede utilizar goto, return, o tal vez llamar abort(), etc. exit()

2

Los || y && operadores son cortocircuito, por lo que si el lado izquierdo de || evalúa a true o en el lado izquierdo de && evalúa falso, el lado derecho no será evaluado. Eso es equivalente a un descanso.

3

No se puede romper el corte de una instrucción if, a menos que use goto.

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

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

Esto daría "var = 1" como salida

16

Es probable que tenga que romper su sentencia if en trozos más pequeños. Dicho esto, se puede hacer dos cosas:

  • envoltura de la declaración en do {} while (false) y utilidad real break (no recomendado !!! enorme kludge !!!)

  • colocar la instrucción en su propia subrutina y use return Este puede ser el primer paso para mejorar su código.

+4

He visto la técnica 'do/while' utilizada y no necesariamente lo consideraría un error, funciona bien y evita problemas que pueda presentar 'goto' (por ejemplo, intentar saltar a través de la inicialización variable) – Nim

+0

de acuerdo que es una mejor solución que goto. – Arkadiy

+0

@phoog, probablemente, pero no lo sé, la pregunta está etiquetada C++, donde no ... – Nim

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

Oh por qué no :)

+1

Eww ... Huelo un poco de curiosidad en esta respuesta. No es técnicamente incorrecto, por supuesto. – Yuck

+13

@Yuck Niza nombre de usuario relevante. En cuanto a la gracia, bueno, un poco, pero yo diría que si su diseño lo obliga a entrar en la situación de los OP, para empezar, usar un goto no lo empeorará. También notas de Phoeog en su respuesta ganadora que los condicionales anidados son realmente solo superficialmente diferentes. –

+0

A veces estás lidiando con el código maloliente de otra persona, y no tienes unas pocas horas/días para refactorizarlo en algo sensato ... r. –

2

tener una etiquetaen el punto que desea saltar, y en su lado si el uso Goto

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

Pongo No conozco las condiciones de prueba, pero un buen viejo switch podría funcionar

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