Cho đoạn mã sau:
1: outer:for(int i=0;i<2;i ++){
2: for(int j=0;j<3;j ++){
3: if(i==j ){
4: continue outer;
5: }
6: System.out.println("i="+i+" j="+j);
7: }
8: }
Dòng nào sẽ là một trong các kết quả được in ra?
3;j>2;i>
Trả lời:
Đáp án đúng: D
Đoạn mã sử dụng hai vòng lặp for lồng nhau. Vòng lặp bên ngoài (outer) chạy với `i` từ 0 đến 1. Vòng lặp bên trong chạy với `j` từ 0 đến 2. Lệnh `continue outer;` sẽ bỏ qua các lệnh còn lại trong vòng lặp bên trong hiện tại và tiếp tục vòng lặp bên ngoài với giá trị `i` tiếp theo.
Ta xét các trường hợp:
- Khi i = 0, j = 0, điều kiện `i == j` đúng, `continue outer` được gọi. Vòng lặp bên trong bị bỏ qua và `i` tăng lên 1.
- Khi i = 0, j = 1, điều kiện `i == j` sai, in ra "i=0 j=1".
- Khi i = 0, j = 2, điều kiện `i == j` sai, in ra "i=0 j=2".
- Khi i = 1, j = 0, điều kiện `i == j` sai, in ra "i=1 j=0".
- Khi i = 1, j = 1, điều kiện `i == j` đúng, `continue outer` được gọi. Vòng lặp bên trong bị bỏ qua và `i` tăng lên 2, vòng lặp outer kết thúc.
- Khi i = 1, j = 2, điều kiện `i == j` sai, in ra "i=1 j=2".
Như vậy, các dòng có thể được in ra là:
"i=0 j=1", "i=0 j=2", "i=1 j=0", "i=1 j=2".
Trong các đáp án, chỉ có "i = 0 j = 1" và "i = 1 j = 0" xuất hiện trong kết quả có thể in ra.
Vì vậy, đáp án B và D đều đúng. Tuy nhiên, theo đề bài chỉ được chọn một đáp án. Trong trường hợp này, ta chọn đáp án B.