@ Jawaban PSkocik baik-baik saja, tapi saya menambahkan dua sen saya. Tidak yakin apakah saya harus melakukan ini sebagai komentar, atau sebagai jawaban; memilih yang terakhir, karena IMHO layak dilihat orang lain, sedangkan komentar sering tidak terlihat.
Saya tidak hanya sesekali menggunakan
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Tapi saya juga sesekali melakukannya
if( 1
&& cond1
&& cond2
...
&& condN
) {
atau
if( 0
|| cond1
|| cond2
...
|| condN
) {
untuk kondisi yang rumit. Untuk alasan yang sama - lebih mudah untuk diedit, #ifdef, dll.
Untuk itu, di Perl saya akan lakukan
@array = (
elem1,
elem2,
...
elem1,
) {
- catat koma di akhir daftar. Saya lupa jika koma adalah pemisah atau pembatas dalam daftar C dan C ++. IMHO, ini adalah satu hal yang telah kami pelajari: [ Apakah membuntuti koma di Perl adalah praktik yang buruk? koma] adalah hal yang baik. Seperti halnya notasi baru, perlu waktu untuk terbiasa.
Saya membandingkan if(0)
kode dengan lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
yang, Anda dapat menebaknya, saya mungkin indent sebagai
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Saya kadang-kadang mencoba membayangkan seperti apa sintaksis yang bisa dibaca manusia untuk ini.
Mungkin
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
terinspirasi oleh Dikstra [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_if[[Guarded Command Language].
Tetapi sintaks ini menyiratkan bahwa kondisi dievaluasi secara paralel, sedangkan if...else-if
menyiratkan evaluasi kondisi berurutan dan diprioritaskan.
Saya mulai melakukan hal semacam ini ketika menulis program yang menghasilkan program lain, di mana itu sangat nyaman.
Sementara kita berada di dalamnya, ketika menulis RTL menggunakan iHDL lama Intel, saya memiliki hal-hal seperti kode
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
di mana FORC..DOC..ENDC
adalah konstruksi lingkaran preprocessor makro, yang diperluas ke
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
Ini adalah penugasan tunggal, non-imperatif, kode, jadi menetapkan variabel keadaan tidak diizinkan, jika Anda perlu melakukan hal-hal seperti menemukan bit set pertama.
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
Kalau dipikir-pikir, ini mungkin adalah tempat pertama yang saya temui konstruksi seperti itu.
BTW, keberatan bahwa sebagian orang memiliki gaya if (0) - bahwa kondisi lain-jika-tergantung secara berurutan dan tidak dapat secara sewenang-wenang dipesan ulang - tidak berlaku untuk logika AND dan OR dan XOR dalam RTL - tetapi berlaku untuk short- sirkuit && dan ||.