#include
void main() {
int a = 1, b = 2;
for (int i = 0; i < 5; i++) {
switch (i){
case 2: a *= b;
case 4: b += 5;
default: a += b;
}
}
printf("%5d%5d", a, b);
cho em hỏi tại sao khi em chạy chương trình trên ứng dụng của lập trình C thì lại ra a=36 và b=12 ạ. Trong khi em tính thì lại ra a=21 và b=7 vậy ạ??
Tuyen Phan
Lý do chương trình trên máy tính ra kết quả a = 36 và b = 12 là vì trong vòng lặp của bạn, câu lệnh switch đang
thiếu lệnh break; ở cuối mỗi case.
Trong ngôn ngữ C, khi một case thỏa mãn mà không có lệnh break để thoát ra, chương trình sẽ tự động chạy tiếp toàn bộ các lệnh ở các case bên dưới nó (bao gồm cả default). Hiện tượng này gọi là
"fall-through" (trôi lệnh).
Dưới đây là chi tiết từng bước máy tính đã chạy để ra được con số 36 và 12:
Khởi tạo ban đầu: a = 1, b = 2
- Khi i = 0:
- Không khớp case 2 hay case 4, nhảy thẳng vào default.
- a = a + b
a = 1 + 2 = 3
- Kết thúc vòng lặp: a = 3, b = 2
- Khi i = 1:
- Tương tự, nhảy vào default.
- a = a + b
a = 3 + 2 = 5
- Kết thúc vòng lặp: a = 5, b = 2
- Khi i = 2 (Lưu ý bước này):
- Khớp case 2: a = a * b
a = 5 * 2 = 10
- Do không có break, chương trình trôi xuống case 4: b = b + 5
b = 2 + 5 = 7
- Vẫn không có break, chương trình trôi tiếp xuống default: a = a + b
a = 10 + 7 = 17
- Kết thúc vòng lặp: a = 17, b = 7
- Khi i = 3:
- Chỉ khớp default.
- a = a + b
a = 17 + 7 = 24
- Kết thúc vòng lặp: a = 24, b = 7
- Khi i = 4:
- Khớp case 4: b = b + 5
b = 7 + 5 = 12
- Do không có break, chương trình trôi xuống default: a = a + b
a = 24 + 12 = 36
- Kết thúc vòng lặp: a = 36, b = 12
Đó chính xác là lý do máy in ra kết quả
36 và 12. Khi bạn tính nhẩm ra 21 và 7, rất có thể bạn đã tính toán theo logic ngầm định là mỗi khi chạy xong một case thì nó tự động kết thúc switch (tức là đã bỏ qua hiện tượng trôi lệnh).
Bạn có muốn tôi viết lại đoạn code này kèm theo lệnh break để xem kết quả trả về có đúng với những gì bạn đã dự tính ban đầu không?
Đoạn code sửa lại để cho ra kết quả [imath]a=21[/imath] và [imath]b=7[/imath][imath]:[/imath]
#include <stdio.h>
int main() {
int a = 1, b = 2;
for (int i = 0; i < 5; i++) {
switch (i) {
case 2:
a *= b;
break;
case 4:
b += 5;
break;
default:
a += b;
break;
}
}
printf("%5d%5d\n", a, b);
return 0;
}