@ คำตอบของ PSkocik นั้นใช้ได้ แต่ฉันเพิ่มสองเซ็นต์ของฉัน ไม่แน่ใจว่าฉันควรทำเช่นนี้เป็นความคิดเห็นหรือเป็นคำตอบ; เลือกอันหลังเนื่องจาก IMHO ให้ความสำคัญกับผู้อื่นที่เห็นในขณะที่ความคิดเห็นมักจะมองไม่เห็น
ไม่เพียง แต่ฉันจะใช้เป็นครั้งคราว
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 ++ IMHO นี่คือสิ่งหนึ่งที่เราได้เรียนรู้: [จุลภาคต่อท้ายใน 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
รับแรงบันดาลใจจาก [Dikstra's [ https://en.wikipedia.org/wiki/Guarded_Command_Language#Selection:_ifrep 35] 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
is คือตัวสร้าง preprocessor วนรอบที่จะขยาย
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) - ซึ่งเงื่อนไขอื่น ๆ นั้นขึ้นอยู่กับการเรียงลำดับและไม่สามารถเรียงลำดับใหม่โดยพลการ - ไม่ใช้กับตรรกะ AND และ OR และ XOR ใน RTL - แต่ใช้กับ short- circuit && และ ||