La respuesta de @ PSkocik está bien, pero agrego mis dos centavos. No estoy seguro si debo hacer esto como un comentario, o como una respuesta; elegir este último, porque en mi humilde opinión vale la pena ver a otros, mientras que los comentarios son con frecuencia invisibles.
No solo uso ocasionalmente
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Pero también ocasionalmente
if( 1
&& cond1
&& cond2
...
&& condN
) {
o
if( 0
|| cond1
|| cond2
...
|| condN
) {
para condiciones complicadas Por las mismas razones: más fácil de editar, #ifdef, etc.
Para el caso, en Perl haré
@array = (
elem1,
elem2,
...
elem1,
) {
- tenga en cuenta la coma al final de la lista. Olvidé si las comas son separadores o delimitadores en las listas C y C ++. En mi humilde opinión, esto es algo que hemos aprendido: [ ¿Las comas finales en Perl son una mala práctica? las comas] son algo bueno. Como cualquier nueva notación, lleva un tiempo acostumbrarse.
Comparo el if(0)
código con lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
que, lo has adivinado, puedo sangrar como
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
A veces he tratado de imaginar cómo podría ser una sintaxis más legible para esto.
Quizás
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
inspirado por Dikstra [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if[[Guarded Command Language].
Pero esta sintaxis implica que las condiciones se evalúan en paralelo, mientras que if...else-if
implica una evaluación secuencial y priorizada de las condiciones.
Comencé a hacer este tipo de cosas cuando escribía programas que generaban otros programas, donde es especialmente conveniente.
Mientras estamos en eso, cuando escribo RTL usando el viejo iHDL de Intel, he codificado cosas 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
donde FORC..DOC..ENDC
es una construcción de bucle de preprocesador de macro, que se expande a
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
Este era un código de asignación única, no imperativo, por lo que no se permitía establecer una variable de estado, si necesitaba hacer cosas como encontrar el primer bit establecido.
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
Ahora que lo pienso, este puede haber sido el primer lugar en el que me encontré con tales construcciones.
Por cierto, las objeciones que algunos tenían al estilo if (0), que las condiciones else-if dependen secuencialmente y no se pueden reordenar arbitrariamente, no se aplican a la lógica AND y OR y XOR en RTL, pero se aplican a short- circuito && y ||.