La réponse de @ PSkocik est très bien, mais j'ajoute mes deux cents. Je ne sais pas si je devrais le faire en commentaire ou en réponse; choisir ce dernier, car IMHO vaut la peine d'être vu, alors que les commentaires sont souvent invisibles.
Non seulement j'utilise occasionnellement
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Mais je fais aussi parfois
if( 1
&& cond1
&& cond2
...
&& condN
) {
ou
if( 0
|| cond1
|| cond2
...
|| condN
) {
pour des conditions compliquées. Pour les mêmes raisons - plus facile à modifier, #ifdef, etc.
D'ailleurs, en Perl, je ferai
@array = (
elem1,
elem2,
...
elem1,
) {
- notez la virgule à la fin de la liste. J'oublie si les virgules sont des séparateurs ou des délimiteurs dans les listes C et C ++. À mon humble avis, c'est une chose que nous avons apprise: [ Les virgules en Perl sont-elles une mauvaise pratique? virgules] sont une bonne chose. Comme toute nouvelle notation, il faut un certain temps pour s'y habituer.
Je compare le if(0)
code à lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
qui, vous l'avez deviné, je peux indenter comme
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
J'ai parfois essayé d'imaginer à quoi pourrait ressembler une syntaxe plus lisible par l'homme.
Peut-être
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
inspiré du [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if[Guarded Command Language] de Dikstra ).
Mais cette syntaxe implique que les conditions sont évaluées en parallèle, alors qu'elle if...else-if
implique une évaluation séquentielle et hiérarchisée des conditions.
J'ai commencé à faire ce genre de choses en écrivant des programmes qui généraient d'autres programmes, là où c'est particulièrement pratique.
Pendant que nous y sommes, lors de l'écriture de RTL en utilisant l'ancien iHDL d'Intel, j'ai codé des trucs comme
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
où FORC..DOC..ENDC
est une construction de boucle de préprocesseur de macro, qui se développe en
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
Il s'agissait d'un code à affectation unique, non impératif, donc la définition d'une variable d'état n'était pas autorisée si vous deviez faire des choses comme trouver le premier bit défini.
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
À bien y penser, c'est peut-être le premier endroit où j'ai rencontré de telles constructions.
BTW, les objections que certains avaient au style if (0) - que les conditions else-if sont séquentiellement dépendantes et ne peuvent pas être arbitrairement réordonnées - ne s'appliquent pas aux logiques AND et OR et XOR dans RTL - mais s'appliquent à short- circuit && et ||.