2011-12-15 19 views
51

Ho una dichiarazione if che voglio "interrompere" di. Capisco che la rottura è solo per i loop. Qualcuno può aiutare?Come faccio a "uscire" da un'istruzione if?

Per quelli che richiedono un esempio di quello che sto cercando di fare:

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

Spiacente nessuno può aiutare. Votato per la chiusura Nessuno può aiutarti se non ci dai qualche dettaglio con qualche frammento di codice – Nawaz

+0

Mostra il codice che rappresenta ciò che stai cercando di fare. –

+2

Puoi fornire un po 'di codice di esempio? E a seconda della situazione, potresti provare un blocco 'switch'; supportano la rottura. – piebie

risposta

54

IFS nidificate:

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

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

A rischio di essere downvoted - è successo a me nel passato - Menzionerò che un'altra opzione (impopolare) sarebbe naturalmente il temuto goto; una dichiarazione di rottura è solo un goto travestito.

E infine, farò eco al sentimento comune che il tuo progetto potrebbe probabilmente essere migliorato in modo che l'imponente dichiarazione if non sia necessaria, per non parlare di scomporla. Almeno si dovrebbe essere in grado di estrarre un paio di metodi, e utilizzare un ritorno:

if (condition) 
{ 
    ExtractedMethod1(); 

    if (breakOutCondition) 
     return; 

    ExtractedMethod2(); 
} 
+4

Rifare i blocchi in funzioni non solo aiuterà la leggibilità, ma probabilmente risolverà anche il problema originale. –

+0

Sicuramente in accordo con la tua seconda osservazione. Tuttavia, direi che il percorso migliore sarebbe quello di affinare la 'condizione' originale, e aggiungerne di nuovi, se necessario, in modo che il blocco di codice che viene immesso quando è soddisfatto corrisponda a ciò che dovrebbe essere eseguito * prima * la pausa in OP idea originale Questo come nel tuo esempio invoca semplicemente un metodo, che potrebbe quindi essere chiamato in blocchi 'condition2',' condition3' ecc. Secondo necessità. –

+6

'goto' è un'ottima soluzione se per ragioni di ambito variabile non è possibile chiamare un'altra funzione. –

2

È possibile utilizzare un'etichetta e un goto, ma questo è un brutto attacco. Dovresti considerare di spostare alcune delle cose nella tua istruzione if per separare i metodi.

1

È possibile utilizzare goto, return, o forse chiamare abort(), exit() ecc

2

I || e && gli operatori sono di corto circuito, quindi se il lato sinistro del || restituisce true o il lato sinistro della && restituisce falso, il lato destro non sarà valutato. È equivalente a una pausa.

3

Non è possibile interrompere l'interruzione di un'istruzione if, a meno che non si usi goto.

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

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

Questo darebbe "var = 1" come uscita

16

Probabilmente è necessario rompere la vostra istruzione if in pezzi più piccoli. Detto questo, si possono fare due cose:

  • avvolgere la dichiarazione in do {} while (false) e reale utilizzo break (sconsigliato !!! enorme kludge !!!)

  • messo la dichiarazione nella propria subroutine e utilizzare return Questo potrebbe essere il primo passo per migliorare il codice.

+4

Ho visto la tecnica 'do/while 'usata e non la considererei necessariamente un kludge funziona bene ed evita i problemi che' goto' può introdurre (ad esempio tentare di saltare attraverso l'inizializzazione delle variabili) – Nim

+0

I'd d'accordo è una soluzione migliore di goto. – Arkadiy

+0

@phoog, probabilmente, ma non lo saprei, la domanda è codificata in C++, dove non ... – Nim

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

Oh perché non :)

+1

Eww ... Sento odore di faccetta in questa risposta. Non che sia tecnicamente scorretto, ovviamente. – Yuck

+13

@Yuck Bel nome utente pertinente. Per quanto riguarda la faccenda, beh, ma direi che se il tuo progetto ti costringe ad entrare nella situazione dei PO, allora usare un goto non peggiorerà la situazione. Inoltre, nella sua risposta vincente, phoog nota che i condizionali nidificati sono in realtà solo superficialmente diversi. –

+0

A volte hai a che fare con il codice maleodorante di qualcun altro, e non hai un paio di ore/giorni per refactoring in qualcosa di sano ... r. –

2

Avere un un'etichetta in un punto che si desidera saltare e in parte vostra se utilizzo goto

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

I don Conoscere le condizioni del test, ma un buon vecchio switch potrebbe funzionare

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