@ PSkocik odpowiedź jest w porządku, ale dodaję moje dwa centy. Nie jestem pewien, czy powinienem to zrobić jako komentarz, czy jako odpowiedź; wybierając to drugie, ponieważ IMHO jest warte zobaczenia przez innych, podczas gdy komentarze są często niewidoczne.
Nie tylko czasami używam
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Ale czasami to robię
if( 1
&& cond1
&& cond2
...
&& condN
) {
lub
if( 0
|| cond1
|| cond2
...
|| condN
) {
dla skomplikowanych warunków. Z tych samych powodów - łatwiejsza edycja, #ifdef itp.
Jeśli o to chodzi, w Perlu zrobię
@array = (
elem1,
elem2,
...
elem1,
) {
- zwróć uwagę na przecinek na końcu listy. Zapomniałem, czy przecinki są separatorami lub ogranicznikami na listach C i C ++. IMHO to jest jedna rzecz, której się nauczyliśmy: [ Czy końcowe przecinki w Perlu to zła praktyka? przecinki] to dobra rzecz. Jak w przypadku każdej nowej notacji, przyzwyczajenie się do niej zajmuje trochę czasu.
Porównuję if(0)
kod do seplenienia
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
który, jak się domyślacie, mogę wcisnąć jako
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Czasami próbowałem sobie wyobrazić, jak mogłaby wyglądać bardziej czytelna dla człowieka składnia.
Być może
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
zainspirowany [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if][Guarded Command Language]] od Dikstry .
Ale ta składnia implikuje, że warunki są oceniane równolegle, podczas gdy if...else-if
implikuje sekwencyjną i priorytetową ocenę warunków.
Zacząłem robić tego typu rzeczy, pisząc programy, które generowały inne programy, gdzie jest to szczególnie wygodne.
Skoro już o tym mowa, pisząc RTL przy użyciu starego iHDL Intela, zakodowałem takie rzeczy jak
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
gdzie FORC..DOC..ENDC
jest konstrukcją pętli preprocesora makra, która rozwija się do
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
To było pojedyncze przypisanie, niewymagający, kod, więc ustawienie zmiennej stanu nie było dozwolone, jeśli trzeba było wykonać takie czynności, jak znalezienie pierwszego ustawionego bitu.
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
Jeśli się nad tym zastanowić, to mogło być pierwsze miejsce, w którym zetknąłem się z takimi konstrukcjami.
Przy okazji, zastrzeżenia, które niektórzy mieli do stylu if (0) - że warunki else-if są sekwencyjnie zależne i nie można ich dowolnie zmieniać - nie dotyczą logiki AND i OR oraz XOR w RTL - ale mają zastosowanie do obwód && i ||.