@ PSkocik отвечает хорошо, но я добавляю свои два цента.Не уверен, должен ли я сделать это как комментарий или как ответ;выбор последнего, потому что ИМХО стоит того, чтобы его видели другие, тогда как комментарии часто невидимы.
Мало того, что я иногда использую
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Но я также иногда делаю
if( 1
&& cond1
&& cond2
...
&& condN
) {
или
if( 0
|| cond1
|| cond2
...
|| condN
) {
для сложных условий.По тем же причинам - проще редактировать, #ifdef и т. Д.
В этом отношении в Perl я сделаю
@array = (
elem1,
elem2,
...
elem1,
) {
- запятую в конце списка,Я забыл, если запятые являются разделителями или разделителями в списках C и C ++.ИМХО, это одна вещь, которую мы узнали: [ Являются ли запятые в Perl плохой практикой? запятые] это хорошая вещь.Как и в любой новой записи, требуется некоторое время, чтобы привыкнуть.
Я сравниваю код if(0)
с lisp
(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][Guarded Язык команд].
Но этот синтаксис подразумевает, что условия оцениваются параллельно, тогда как if...else-if
подразумевает последовательную и приоритетную оценку условий.
Я начал делать этот видвещь при написании программ, созданных другими программами, где это особенно удобно.
Пока мы работаем над этим, при написании RTL с использованием старого iHDL от Intel я кодировал такие вещи, как
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
, где FORC..DOC..ENDC
- это конструкция цикла макропроцессора, которая расширяется до
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
Это был код с одним присваиванием, не являющийся императивным, поэтому установка переменной состояния была запрещена, если вам нужно было выполнить такие действия, как поиск первого установленного бита.
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
Comeесли подумать, это, возможно, было первое место, с которым я столкнулся с такими конструкциями.
Кстати, возражения, которые некоторые имели против стиля if (0), - что условия else-if-условия последовательно зависят ине может быть произвольно переупорядочен - не применяется к логикам AND и OR и XOR в RTL - но применяется к коротким замыканиям && и ||.