La risposta di @ PSkocik va bene, ma aggiungo i miei due centesimi. Non sono sicuro se dovrei farlo come commento o come risposta; scegliendo quest'ultimo, perché IMHO merita di essere visto dagli altri, mentre i commenti sono spesso invisibili.
Non solo lo uso occasionalmente
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Ma lo faccio anche occasionalmente
if( 1
&& cond1
&& cond2
...
&& condN
) {
o
if( 0
|| cond1
|| cond2
...
|| condN
) {
per condizioni complicate. Per gli stessi motivi: più facile da modificare, #ifdef, ecc.
Del resto, in Perl lo farò
@array = (
elem1,
elem2,
...
elem1,
) {
- notare la virgola alla fine dell'elenco. Dimentico se le virgole sono separatori o delimitatori negli elenchi C e C ++. IMHO questa è una cosa che abbiamo imparato: [ Le virgole finali in Perl sono una cattiva pratica? virgole] sono una buona cosa. Come ogni nuova notazione, ci vuole un po 'per abituarsi.
Confronto il if(0)codice con lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
che, avete indovinato, potrei indentare come
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
A volte ho provato a immaginare quale potrebbe essere una sintassi più umana leggibile per questo.
Forse
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
ispirato da Dikstra [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if lasting[Guarded Command Language].
Ma questa sintassi implica che le condizioni siano valutate in parallelo, mentre if...else-ifimplica una valutazione sequenziale e prioritaria delle condizioni.
Ho iniziato a fare questo genere di cose durante la scrittura di programmi che hanno generato altri programmi, dove è particolarmente conveniente.
Mentre ci siamo, quando scrivo RTL usando il vecchio iHDL di Intel, ho codificato cose come
IF 0 THEN /*nothing*/
**FORC i FROM 1 TO 10 DOC**
ELSE IF signal%i% THEN
// stuff to do if signal%i% is active
**ENDC**
ELSE
// nothing matched
ENDIF
dove FORC..DOC..ENDCè un costrutto per il ciclo del preprocessore macro, che si espande in
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
// stuff to do if signal1 is active
ELSE IF signal2 THEN
// stuff to do if signal2 is active
...
ELSE IF signal100 THEN
// stuff to do if signal100 is active
ELSE
// nothing matched
ENDIF
Si trattava di un codice a assegnazione singola, non imperativo, quindi l'impostazione di una variabile di stato non era consentita, se era necessario eseguire operazioni come trovare il primo bit impostato.
IF 0 THEN /*nothing*/
ELSE IF signal1 THEN
found := 1
ELSE IF signal2 THEN
found := 2
...
ELSE IF signal100 THEN
found := 100
ELSE
// nothing matched
ENDIF
Vieni a pensarci bene, questo potrebbe essere stato il primo posto in cui ho incontrato tali costrutti.
A proposito, le obiezioni che alcuni avevano sullo stile if (0) - che le condizioni else-if sono sequenzialmente dipendenti e non possono essere arbitrariamente riordinate - non si applicano alla logica AND e OR e XOR in RTL - ma si applicano a short- circuito && e ||.