@ PSkocik ответ в порядке, но я добавляю свои два цента. Не уверен, следует ли мне сделать это как комментарий или как ответ; выбирая последнее, потому что ИМХО стоит того, чтобы другие посмотрели, а комментарии часто не видны.
Я не только иногда использую
if(0) {
} else if( cond1 ) {
} else if( cond2 ) {
...
} else {
}
Но я также иногда делаю
if( 1
&& cond1
&& cond2
...
&& condN
) {
или
if( 0
|| cond1
|| cond2
...
|| condN
) {
для сложных условий. По тем же причинам - проще редактировать, #ifdef и т. Д.
Если на то пошло, в Perl я сделаю
@array = (
elem1,
elem2,
...
elem1,
) {
- обратите внимание на запятую в конце списка. Я забываю, являются ли запятые разделителями или разделителями в списках C и C ++. ИМХО, это одна вещь, которую мы узнали: [ Заключительные запятые в Perl - плохая практика? запятые] - это хорошо. Как и к любым новым обозначениям, нужно время, чтобы к ним привыкнуть.
Я сравниваю if(0)
код с лиспом
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
который, как вы уже догадались, я могу обозначить как
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Иногда я пытался представить, как может выглядеть более понятный для человека синтаксис.
Возможно
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
Вдохновленный [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if provided[Guarded Command Language] Дикстры ).
Но этот синтаксис подразумевает, что условия оцениваются параллельно, тогда как if...else-if
подразумевает последовательную и приоритетную оценку условий.
Я начал делать такие вещи, когда писал программы, генерирующие другие программы, где это особенно удобно.
Пока мы пишем RTL с использованием старого iHDL Intel, я закодировал такие вещи, как
IF 0 THEN
**FORC i FROM 1 TO 10 DOC**
ELSE IF signal%i% THEN
**ENDC**
ELSE
ENDIF
где FORC..DOC..ENDC
- конструкция цикла макрокоманды препроцессора, которая расширяется до
IF 0 THEN
ELSE IF signal1 THEN
ELSE IF signal2 THEN
...
ELSE IF signal100 THEN
ELSE
ENDIF
Это был код с однократным присваиванием, не обязательный, поэтому установка переменной состояния была запрещена, если вам нужно было сделать что-то вроде поиска первого установленного бита.
IF 0 THEN
ELSE IF signal1 THEN
found := 1
ELSE IF signal2 THEN
found := 2
...
ELSE IF signal100 THEN
found := 100
ELSE
ENDIF
Если подумать, возможно, я впервые столкнулся с подобными конструкциями.
Кстати, возражения, которые некоторые высказывали против стиля if (0) - что условия else-if последовательно зависят и не могут быть произвольно переупорядочены - не относятся к логике AND, OR и XOR в RTL - но относятся к коротким- схема && и ||.