Câu trả lời của @ PSkocik là tốt, nhưng tôi thêm hai xu của mình. Không chắc chắn nếu tôi nên làm điều này như một bình luận, hoặc như một câu trả lời; chọn cái sau, bởi vì IMHO đáng để người khác nhìn thấy, trong khi các bình luận thường vô hình.
Tôi không chỉ thỉnh thoảng sử dụng
if(0) {
//deliberately left empty
} else if( cond1 ) {
//deliberately left empty
} else if( cond2 ) {
//deliberately left empty
...
} else {
// no conditions matched
}
Nhưng tôi cũng thỉnh thoảng làm
if( 1
&& cond1
&& cond2
...
&& condN
) {
hoặc là
if( 0
|| cond1
|| cond2
...
|| condN
) {
cho các điều kiện phức tạp. Vì những lý do tương tự - dễ dàng chỉnh sửa hơn, #ifdef, v.v.
Đối với vấn đề đó, trong Perl tôi sẽ làm
@array = (
elem1,
elem2,
...
elem1,
) {
- lưu ý dấu phẩy ở cuối danh sách. Tôi quên nếu dấu phẩy là dấu phân cách hoặc dấu phân cách trong danh sách C và C ++. IMHO đây là một điều chúng tôi đã học được: [ Dấu phẩy trong Perl có phải là một thực tiễn xấu không? dấu phẩy] là một điều tốt. Giống như bất kỳ ký hiệu mới nào, phải mất một thời gian để làm quen.
Tôi so sánh if(0)
mã với lisp
(cond (test1 action1)
(test2 action2)
...
(testn actionn))
mà, bạn đoán nó, tôi có thể thụt lề
(cond
(test1 action1)
(test2 action2)
...
(testn actionn)
)
Đôi khi tôi đã cố gắng tưởng tượng một cú pháp dễ đọc hơn của con người cho việc này có thể trông như thế nào.
Có lẽ
IF
:: cond1 THEN code1
:: cond2 THEN code2
...
:: condN THEN codeN
FI
lấy cảm hứng từ [ https://en.wikipedia.org/wiki/Guarded_Command_L Language# Selection:_if[[Guarded Language Language] của Dikstra .
Nhưng cú pháp này ngụ ý rằng các điều kiện được đánh giá song song, trong khi if...else-if
ngụ ý đánh giá tuần tự và ưu tiên các điều kiện.
Tôi bắt đầu làm những việc như thế này khi viết các chương trình tạo ra các chương trình khác, nơi nó đặc biệt thuận tiện.
Trong khi chúng ta đang ở đó, khi viết RTL bằng iHDL cũ của Intel, tôi đã mã hóa những thứ như
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
trong đó FORC..DOC..ENDC
cấu trúc vòng lặp tiền xử lý macro, mở rộng thành
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
Đây là phép gán đơn, không bắt buộc, mã, vì vậy việc đặt biến trạng thái là không được phép, nếu bạn cần thực hiện những việc như tìm bit set đầu tiên.
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
Nghĩ lại thì, đây có thể là nơi đầu tiên tôi gặp phải những công trình như vậy.
BTW, sự phản đối mà một số người phải theo kiểu if (0) - rằng các điều kiện khác nếu phụ thuộc tuần tự và không thể được sắp xếp lại một cách tùy tiện - không áp dụng cho logic AND và OR và XOR trong RTL - nhưng áp dụng cho ngắn- mạch && và ||.