Tôi muốn thêm vào - và một phần mâu thuẫn - các câu trả lời trước đó. Mặc dù chắc chắn thường sử dụng if-if nếu theo cách giống như chuyển đổi sẽ bao gồm toàn bộ các giá trị có thể nghĩ được cho một biểu thức, nhưng không có nghĩa là đảm bảo rằng mọi phạm vi điều kiện có thể được bao phủ hoàn toàn. Điều tương tự cũng có thể nói về chính cấu trúc chuyển đổi, do đó yêu cầu sử dụng mệnh đề mặc định, bắt tất cả các giá trị còn lại và nếu không, nếu không được yêu cầu, dù sao đi nữa, được sử dụng như một biện pháp bảo vệ khẳng định.
Bản thân câu hỏi có một ví dụ phản biện tốt: Điều kiện thứ hai hoàn toàn không liên quan đến x (đó là lý do tại sao tôi thường thích biến thể dựa trên if linh hoạt hơn so với biến thể dựa trên chuyển đổi). Từ ví dụ, rõ ràng là nếu điều kiện A được đáp ứng, x nên được đặt thành một giá trị nhất định. Nếu A không được đáp ứng, thì điều kiện B được kiểm tra. Nếu nó được đáp ứng, thì x sẽ nhận được giá trị khác. Nếu cả A và B không được đáp ứng, thì x sẽ không thay đổi.
Ở đây chúng ta có thể thấy rằng một nhánh trống khác nên được sử dụng để nhận xét về ý định của người lập trình cho người đọc.
Mặt khác, tôi không thể thấy tại sao phải có một mệnh đề khác, đặc biệt là cho câu lệnh if mới nhất và trong cùng. Trong C, không có thứ gọi là 'if if'. Chỉ có nếu và khác. Thay vào đó, theo MISRA, cấu trúc nên chính thức được thụt vào theo cách này (và tôi nên đặt dấu ngoặc nhọn mở trên đường kẻ của riêng họ, nhưng tôi không thích điều đó):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Khi MISRA yêu cầu đặt các dấu ngoặc nhọn quanh mỗi nhánh, thì nó tự mâu thuẫn bằng cách đề cập đến "nếu ... khác nếu xây dựng".
Bất cứ ai cũng có thể tưởng tượng sự xấu xí của cây sâu làm tổ nếu cây khác, xem ở đây trên một ghi chú bên . Bây giờ hãy tưởng tượng rằng cấu trúc này có thể được mở rộng tùy ý ở bất cứ đâu. Sau đó, yêu cầu một điều khoản khác cuối cùng, nhưng không phải bất cứ nơi nào khác, trở nên vô lý.
if (A) {
if (B) {
// do something
}
// you could to something here
}
else {
// or here
if (B) { // or C?
// do something else (no pun intended)
}
else {
// don't do anything here, if you don't want to
}
// what if I wanted to do something here? I need brackets for that.
}
Vì vậy, tôi chắc chắn rằng những người đã phát triển các hướng dẫn MISRA có chuyển đổi - giống như nếu khác nếu có ý định trong tâm trí.
Cuối cùng, họ quyết định chính xác ý nghĩa của "nếu ... khác nếu xây dựng"