[Imperative Programming + C] Bài 8 – Goto & Looping

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

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>intmain(){goto label;printf("This statement should be ignored.");

   label:printf("This statement is labeled.");// - - - - - - - - - - - - - - - - - -return0;}
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>intmain(){int count =0;// - - - - - - - - - - - - - - - - - -
   loop:printf("n Do something ...");
      count +=1;printf("n Looped %i time(s)", count);if(count <9)goto loop;// - - - - - - - - - - - - - - - - - -return0;}
gcc main.c -o main
main

 Do something ...
 Looped 1 times
 Do something ...
 Looped 2 times
 Do something ...
 Looped 3 times
 Do something ...
 Looped 4 times
 Do something ...
 Looped 5 times
 Do something ...
 Looped 6 times
 Do something ...
 Looped 7 times
 Do something ...
 Looped 8 times
 Do something ...
 Looped 9 times

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ụ. Tuy nhiên nếu viết thụt vào như vậy chúng ta sẽ dễ quan sát hơn. Và đồng thời những câu lệnh ảnh hưởng tới biến xét điều kiện như biến count trong ví dụ trên nên được đặt ở ví trí đầu hoặc cuối của vòng lặp, hoặc viết lùi lại ngang hàng với hai điểm nối mở đầu vòng lặp và xét điều kiện lặp.

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 thì mỗi lựa chọn đều có lợi điểm riêng và mình chọn tiếp tục sử dụng goto label; để tự tạo các logic code lặp trong C. Lý do là bởi vì mình không học C để thi Hackathon hay hướng đến lập trình nhúng trên các thiết bị đầu cuối, vì vậy nên sẽ không quan tâm mấy tới những cú pháp “ngắn gọn” sẵn có của C. Thay vào đó thì mình muốn sử dụng những công cụ cơ bản của C cung cấp để xây dựng nên những công cụ cần sử dụng có cú pháp thân thiện với một newbie JavaScript như mình. 😄

(chưa đăng tải) [Imperative Programming + C] Bài 9 – Header & Preprocessor

Nguồn: viblo.asia

Bài viết liên quan

Thay đổi Package Name của Android Studio dể dàng với plugin APR

Nếu bạn đang gặp khó khăn hoặc bế tắc trong việc thay đổi package name trong And

Lỗi không Update Meta_Value Khi thay thế hình ảnh cũ bằng hình ảnh mới trong WordPress

Mã dưới đây hoạt động tốt có 1 lỗi không update được postmeta ” meta_key=

Bài 1 – React Native DevOps các khái niệm và các cài đặt căn bản

Hướng dẫn setup jenkins agent để bắt đầu build mobile bằng jenkins cho devloper an t

Chuyển đổi từ monolith sang microservices qua ví dụ

1. Why microservices? Microservices là kiến trúc hệ thống phần mềm hướng dịch vụ,