Câu lệnh if lồng nhau
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| nested if/ˈnestɪd ɪf/ | if lồng nhau |
Nhánh mở đầu quá rộng che khuất điểm cao nhất
- Thang điểm kiểm tra
s >= 60trướcelse if (s >= 90). Với s=95, điều kiện đầu tiên là đúng, nên nhánh của nó chạy và nhánh điểm cao nhất không bao giờ được kiểm tra. - Đối với các ngưỡng dưới chồng chập này, hãy kiểm tra ngưỡng cao hơn trước. Đây là quy tắc suy luận cho thang điểm này, không phải yêu cầu sắp xếp mọi điều kiện từ "cụ thể nhất" đến "thông dụng nhất".
Lồng nhau khiến quyết định phụ thuộc vào đường dẫn bao bọc
- Một if lồng nhau đặt một if bên trong một nhánh khác. Nếu câu lệnh bên trong nằm ở nhánh đúng của phía ngoài, nó chỉ được thực hiện khi điều kiện phía ngoài đó đúng; một if nằm trong else sẽ được thực hiện trên đường đi sai thay.
- Dùng ngoặc nhọn để thể hiện cấu trúc này. Một else không có ngoặc nhọn sẽ liên kết với if gần nhất chưa được khớp, điều này có thể khác với những gì thụt lề gợi ý.
Thang điểm chọn nhánh đầu tiên khớp
- Một thang điểm
if ... else if ... elsekiểm tra các điều kiện từ trên xuống dưới cho đến khi tìm thấy điều kiện đúng đầu tiên. Với một else cuối cùng, một nhánh được chọn khi việc đánh giá điều kiện hoàn tất; không có else thì có thể không có nhánh nào chạy. - Phương thức bên dưới nhận điểm số nguyên thông thường và trả về A, B, C hoặc F. Với 85, nó kiểm tra 90, sau đó 80, trả về B, và không bao giờ đánh giá các thử nghiệm nhánh còn lại.
public class GradeChoice {
public static String grade(int s) {
if (s >= 90) {
return "A";
} else if (s >= 80) {
return "B";
} else if (s >= 70) {
return "C";
} else {
return "F";
}
}
}
Phân biệt trường hợp giao nhau và rời rạc
- Với các cận dưới giao nhau,
s >= 60bao gồm mọi điểm số thỏa mãns >= 90. Đặt nó đầu tiên sẽ ngăn nhánh thứ hai được chọn, mặc dù Java có thể biên dịch chuỗi lệnh này. - Đối với các kiểm tra hoàn toàn rời rạc như
x < 0,x == 0vàx > 0, việc thay đổi thứ tự của chúng trong khi vẫn giữ nguyên kết quả không nhất thiết làm thay đổi kết quả cuối cùng. Tuy nhiên, các chính sách giao nhau có thể cố tình ưu tiên một trường hợp cụ thể; hãy tuân thủ yêu cầu đã nêu.
Nhánh đầu tiên đúng thắng cuộc
s = 85 đi vào nhánh >= 80 (B); các nhánh sau bị bỏ qua.
Trong một thang if-else, khối của điều kiện nào sẽ chạy?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Java đi vào điều kiện đầu tiên đúng từ trên xuống dưới.
Đối với if (s>=90) A; else if (s>=80) B; else C; với s = 85, kết quả là...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
85 không đạt >=90 nhưng đạt >=80 → B, sau đó dừng.
Nếu một điều kiện rộng xuất hiện trước một điều kiện hẹp trong thang, nhánh hẹp có thể trở nên không thể truy cập được.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Điều kiện rộng bắt những trường hợp này trước; hãy đặt điều kiện chặt chẽ nhất lên đầu.
Đối với câu if lồng bên trong nhánh đúng của câu if ngoài, điều kiện của câu if lồng vẫn được kiểm tra ngay cả khi điều kiện của câu if ngoài là sai.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Câu lệnh lồng bên trong đó không được thực thi trên nhánh sai. Nếu đặt câu if bên trong nhánh else thì đường bao bọc (enclosing path) sẽ khác.
Đối với thang điểm hiển thị sử dụng s >= 90, s >= 80 và s >= 70, thứ tự nào sẽ giữ nguyên các mức điểm cao nhất theo ý định?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Các ngưỡng dưới cao hơn được đặt trước vì các phép so sánh này chồng lên nhau. Đây không phải là quy tắc thứ tự phổ quát cho tất cả các điều kiện Boolean.
Tách các if độc lập khỏi cấu trúc ladder
- Hai câu lệnh riêng biệt,
if (s >= 60) ...; if (s >= 90) ...;, đều thực thi thân của chúng cho s=95. Một chuỗi if-else liên kết các phương án thay thế và chỉ chọn lần khớp đầu tiên. - Hãy theo dõi bằng các giá trị thực tế tại ngưỡng và ngay bên dưới nó: 90 đi đến A, 89 đến B, 80 đến B, 79 đến C và 69 đến F. Kiểm tra chỉ duy nhất 85 sẽ bỏ sót sai lầm về toán tử ranh giới.
"Đầu tiên đúng chiến thắng" mô tả chuỗi if-else liên kết, không phải nhiều câu if độc lập. Một nhánh có thể không thể được chọn vì phép so sánh trước đó đã bắt tất cả các đầu vào của nó mà không gây ra lỗi statement không thể truy cập được tại thời điểm biên dịch.
Hai câu lệnh if độc lập kiểm tra s >= 60 và s >= 90. Với s=95, có bao nhiêu khối lệnh được thực thi?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Cả hai điều kiện đều đúng và các câu lệnh là độc lập, nên cả hai khối lệnh đều được thực thi.
Theo dõi nhánh giả của câu if ngoài
- Trong
if (weekday) { ... } else { if (raining) { ... } }, phép kiểm tra raining ở bên trong được tiếp cận khi weekday là false. Nhánh bao quanh (không phải chỉ từ "lồng nhau") mới xác định thời điểm nó chạy. - Xác định dấu ngoặc nhọn, các phương án liên kết, điều kiện giao nhau và đầu vào thực tế trước khi dự đoán đường dẫn. Giữ cho chính sách của mã nguồn và các kiểm tra ranh giới nhất quán; chỉ thụt lề đơn thuần không quyết định cách nhóm mã của Java.
Một câu if lồng nhau chỉ chạy khi điều khiển đạt đến nhánh bao quanh nó. Một chuỗi if-else liên kết chọn điều kiện true đầu tiên; các câu if độc lập có thể chạy nhiều thân. Các ngưỡng cao hơn nằm ở đầu trong chuỗi điểm số này vì các điều kiện của chúng giao nhau.
With if (s >= 60) result = 1; else if (s >= 90) result = 2; else result = 3;, what is result for s = 95?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
95 satisfies the first comparison, so result becomes 1 and the else-if branch is skipped.
Một câu lệnh if nằm bên trong nhánh else của câu lệnh ngoài có thể được truy cập khi điều kiện ngoài là sai.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Có: đường đi giả (false) của câu lệnh ngoài sẽ vào nhánh else, nơi phép kiểm tra bên trong có thể được thực thi.