A resposta de @ PSkocik é boa, mas adiciono meus dois centavos. Não tenho certeza se devo fazer isso como um comentário ou como resposta; escolhendo o último, porque IMHO vale a pena ver outros, enquanto comentários são frequentemente invisíveis.
Não só uso ocasionalmente
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Mas eu também ocasionalmente
if( 1
&& cond1
&& cond2
...
&& condN
) {
ou
if( 0
|| cond1
|| cond2
...
|| condN
) {
para condições complicadas. Pelas mesmas razões - mais fácil de editar, #ifdef, etc.
Por falar nisso, no Perl eu farei
@array = (
elem1,
elem2,
...
elem1,
) {
- observe a vírgula no final da lista. Eu esqueço se vírgulas são separadores ou delimitadores nas listas C e C ++. IMHO, isso é uma coisa que aprendemos: [ As vírgulas finais no Perl são uma má prática? vírgulas] são uma coisa boa. Como qualquer nova notação, leva um tempo para se acostumar.
Eu comparo o if(0)
código ao lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
que você adivinhou, posso recuar como
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Às vezes, tentei imaginar como seria uma sintaxe legível por humanos.
Possivelmente
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
inspirado pelo de Dikstra [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if][Guarded Command Language].
Mas essa sintaxe implica que as condições são avaliadas em paralelo, enquanto if...else-if
implica avaliação sequencial e priorizada das condições.
Comecei a fazer esse tipo de coisa ao escrever programas que geravam outros programas, onde é especialmente conveniente.
Enquanto estamos trabalhando nisso, ao escrever RTL usando o antigo iHDL da Intel, codifiquei coisas como
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
onde FORC..DOC..ENDC
é uma construção de loop de pré-processador de macro, que se expande para
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
Esse era um código de atribuição única, não imperativa, portanto, a configuração de uma variável de estado não era permitida, se você precisasse fazer coisas como encontrar o primeiro bit definido.
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
Venha para pensar sobre isso, este pode ter sido o primeiro lugar que eu encontrei essas construções.
BTW, as objeções que alguns tinham ao estilo if (0) - de que as condições else-if-dependem sequencialmente e não podem ser reordenadas arbitrariamente - não se aplicam à lógica AND e OR e XOR na RTL - mas se aplicam a circuito && e ||.