Bên cạnh cấu trúc if..else
hỗ trợ điều khiển logic thực thi code dựa trên điều kiện được cung cấp, thì C
còn cung cấp một bộ công cụ khác giúp thay đổi trình tự thực thi các câu lệnh. Đó là lệnh goto
và thao tác gắn nhãn label:
cho một câu lệnh đơn hoặc một khối lệnh nào đó.
goto label;
Logic hoạt động của câu lệnh này rất đơn giản. Trình thực thi code sẽ di chuyển thẳng tới vị trí câu lệnh đơn hoặc khối lệnh nào đó ở trong cùng phạm vi của sub-program
hiện tại và có gắn nhãn label:
.
# include <stdio.h>
void main () {
goto label;
fprintf (stdout, "This statement should be ignored.");
label: fprintf (stdout, "This statement is labeled.");
}
gcc main.c -o main
main
This statement is labeled.
Trong đó thì tên nhãn label
có thể được đặt tùy ý miễn sao không phải là một từ khóa đã được định nghĩa sẵn của C
hoặc tên biến hay tên một chương trình con nào đó.
goto loop;
Chức năng của câu lệnh goto label;
không bị giới hạn là phải luôn di chuyển tới một vị trí được gắn nhãn label:
sau đó. Chúng ta hoàn toàn có thể sử dụng goto label;
ở vị trí đứng sau điểm được gắn nhãn label:
để lặp lại tiến trình thực thi một đoạn code. Tuy nhiên trong trường hợp này thì chúng ta sẽ cần thiết lập thêm một cơ chế để dừng việc xoay vòng từ goto label;
sau một số lần lặp hữu hạn.
# include <stdio.h>
void main () {
int $count = 0;
loop: $count += 1;
fprintf (stdout, "Do something ... \n");
fprintf (stdout, "Looped %i time(s) \n", $count);
if ($count < 9) goto loop;
}
gcc main.c -o main
main
Do something ...
Looped 1 time(s)
Do something ...
Looped 2 time(s)
Do something ...
Looped 3 time(s)
Do something ...
Looped 4 time(s)
Do something ...
Looped 5 time(s)
Do something ...
Looped 6 time(s)
Do something ...
Looped 7 time(s)
Do something ...
Looped 8 time(s)
Do something ...
Looped 9 time(s)
Trong code ví dụ ở trên, chúng ta có hai điểm nối mở đầu và kết thúc vòng lặp là vị trí gắn nhãn loop:
và vị trí xét điều kiện để quay trở lại bằng goto loop;
. Các câu lệnh ở giữa hai điểm này có thể được viết thẳng hàng mà không cần thụt vào thêm một khoảng như trong code ví dụ.
Các cú pháp lặp
Việc cần phải viết code để tự động lặp lại một số thao tác xử lý là rất phổ biến và vì vậy nên C
có cung cấp các cú pháp lặp mà mình thường gọi là các cú pháp vòng lặp nguyên thủy. Tất cả các cú pháp này về cơ bản là được đưa ra để chúng ta không phải viết các lệnh goto
và đặt nhiều tên loop_label
khi cần viết nhiều vòng lặp trong cùng một đoạn code. Nhờ vậy thì code viết bởi nhiều người khác sau sẽ có giao diện chung về các từ khóa tượng trưng cho vòng lặp như for
, while
, do..while
.
Tuy nhiên, các cấu trúc này có lẽ cũng đã khá quen thuộc và chúng ta sẽ không cần thêm code ví dụ ở đây. H