Operatore condizionale in C
-
24-09-2019 - |
Domanda
ogni if...then...else essere convertito in una situazione equivalente utilizzando solo ?:
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).