@ Відповідь 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 тощо.
З цього приводу в Перлі я зроблю
@array = (
elem1,
elem2,
...
elem1,
) {
- відзначте кому в кінці списку. Я забуваю, якщо коми є роздільниками або роздільниками у списках C і C ++. ІМХО, це одне, чого ми дізналися: [ Чи є трелі комами в Перлі поганою практикою? коми] - добра справа. Як і будь-яке нове позначення, потрібно звикати час.
Я порівнюю 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 Command Language].
Але цей синтаксис означає, що умови оцінюються паралельно, тоді як 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
Подумайте, це, можливо, було першим місцем, коли я стикався з такими конструкціями.
BTW, заперечення, що деякі мали у стилі if (0) - що умови "else-if" є послідовно залежними і не можуть бути довільно упорядковані - не застосовуються до логіки AND та OR або XOR в RTL - але стосуються коротких- ланцюг && та ||