Công nghệ Lập trình C

Tuyen Phan

Học sinh mới
16 Tháng mười 2024
1
0
1
20
TP Hồ Chí Minh
[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

#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 ạ??
 

lengoctutb

Học sinh tiến bộ
Thành viên
28 Tháng hai 2016
1,372
990
271
#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;
}
 
Top Bottom