Domanda

ogni if...then...else essere convertito in una situazione equivalente utilizzando solo ?:

È stato utile?

Soluzione

Mentre qualsiasi uso che posso pensare per l'operatore ternario può essere implementato come un if/else, il contrario non è vero;almeno non senza ricorrere perverso e inutile "trucchi" che non producono alcun beneficio in termini di prestazioni, la leggibilità o la manutenibilità.

La sintassi dell'if/else è:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

considerando che la sintassi del ?:operatore ternario è:

<boolean expression> ? <expression> : <expression> ;

La cosa importante qui è che un <expression> e un <statement> sono diversi elementi sintattici.

Il limitato utilizzo del modulo:

if( b ) x = y else x = z ;

può essere implementato come:

x = b ? y : x ;

ma qui il limite è che la stessa variabile viene assegnato sia il vero e il falso clausole, (e quindi y e z sono sia almeno convertibile per il tipo di x).Quindi si può dire che qualsiasi assegnazione condizionale può essere implementato con l'operatore ternario (dopo tutto quello che è il suo scopo principale).

Ora, dal momento che la chiamata di una funzione è un'espressione valida, si può avvolgere il vero e il falso clausole in funzioni separate, ma per fare che semplicemente per dimostrare un punto è un po ' perverso:

if( b )
    true_stuff() ;
else
    false_stuff() ;

è equivalente a:

b ? true_stuff() : false_stuff() ;

e tali funzioni possono contenere qualsiasi tipo di codice.

Così per la conversione più generale if/else caso ?:l'operazione, true/false blocchi di dichiarazione deve prima essere avvolto in funzioni separate.Tuttavia, anche allora, Neil Butterworth esempi sconfiggere questo approccio, poiché il comportamento di break, continue, e return influenzare il flusso di controllo al di là dei confini di if/else costruire, (anche se forse sono anche esempi di codice che si desidera evitare!).La presenza di un goto in if/else sarebbe anche la sconfitta di questo approccio..

Penso che alla fine, anche se è impossibile, perché si vuole?

Altri suggerimenti

Codice:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

non può essere convertito in:

flag ? exit(1) : return 0;

Un esempio migliore - questo sarebbe all'interno di un ciclo:

if ( flag ) {
   continue;
}
else {
   break;
}

non può essere convertito in:

flag ? continue : break;

No.

Entrambi i "rami" dell'espressione condizionale deve restituire lo stesso tipo, e che tipo non deve essere void.

Per esempio, si potrebbe fare così:

x > 0 ? printf("Positive!\n") : 0;

perché printf ritorno int.(Vorrei usare solo questo, in un giro di codice di golf, anche se,infatti, Ho appena fatto.)

Ma non è possibile fare questo:

x > 0 ? exit() : 0;

perché exit restituisce void (o, in realtà, non tornare affatto).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top