@ PSkocik'in cevabı iyi, ama ben iki sent ekliyorum. Bunu bir yorum olarak mı yoksa bir cevap olarak mı yapmam gerektiğinden emin değilim; ikincisini seçmek, çünkü IMHO başkalarına görülmeye değer, oysa yorumlar sıklıkla görünmezdir.
Sadece arada sırada kullanmıyorum
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Ama ben de arada sırada yaparım
if( 1
&& cond1
&& cond2
...
&& condN
) {
veya
if( 0
|| cond1
|| cond2
...
|| condN
) {
karmaşık durumlar için. Aynı nedenlerle - daha kolay düzenleme, #ifdef vb.
Bu konuda, Perl'de yapacağım
@array = (
elem1,
elem2,
...
elem1,
) {
- listenin sonunda virgül kullanın. Virgül C ve C ++ listelerinde ayırıcı veya ayırıcı olup olmadığını unutuyorum. IMHO bu öğrendiğimiz bir şey: [ Perl'de virgül kullanmak kötü bir uygulama mı? virgül] iyi bir şeydir. Herhangi bir yeni gösterim gibi, alışmak biraz zaman alır.
if(0)
Kodu lisp ile karşılaştırırım
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
ki, tahmin ettiniz, girintili olarak
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Bazen bunun için daha insan tarafından okunabilir bir sözdiziminin nasıl olabileceğini hayal etmeye çalıştım.
belki
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
esinlenerek Dikstra'nın [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if 162[Guarded Komut Dili].
Ancak bu sözdizimi koşulların paralel olarak değerlendirildiğini gösterirken, if...else-if
değerlendirilmesini, koşulların sıralı ve öncelikli olarak değerlendirilmesini gerektirir.
Özellikle uygun olan başka programlar üreten programlar yazarken bu tür şeyleri yapmaya başladım.
Biz oradayken, Intel'in eski iHDL'sini kullanarak RTL yazarken,
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
burada FORC..DOC..ENDC
bir makro önişlemci döngü yapısıdır.
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
Bu tek atama, zorunlu olmayan bir koddu, bu nedenle ilk ayar bitini bulmak gibi şeyler yapmanız gerekiyorsa, bir durum değişkeni ayarlanmasına izin verilmiyordu.
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
Düşünmeye gel, bu tür yapılarla ilk karşılaştığım yer olabilir.
BTW, bazılarının if (0) stiline olan itirazları - else-if-koşullarının sırayla bağımlı olduğu ve keyfi olarak yeniden düzenlenemediği - RTL'deki AND ve OR ve XOR mantıklarına uygulanmaz - ancak devre && ve ||.