C là một ngơn ngữ lập trình có cấu trúc, tuy vậy nó vẫn chứa một số câu lệnh làm phá vớ cấu trúc của chương trình:
Bài 9 Hàm Mục tiêu:
9.7.4 Biến thanh gh
Các máy tính có các thanh ghi trong bộ số học logic - Arithmetic Logic Unit (ALU), các thanh ghi này được sử dụng để tạm thời lưu trữ dữ liệu được truy xuất thường xuyên. Kết quả tức thời của phép tính tốn cũng được lưu vào các thanh ghi. Các thao tác thực hiện trên dữ liệu lưu trữ
trong các thanh ghi thì nhanh hơn dữ liệu trong bộ nhớ. Trong ngơn ngữ assembly (hợp ngữ), người lập trình phải truy xuất đến các thanh ghi này và sử dụng chúng để giúp chương trình chạy nhanh hơn. Các ngơn ngữ lập trình bậc cao thường khơng truy xuất đến các thanh ghi của máy tính. Trong C, việc lựa chọn vị trí lưu trữ cho một giá trị tùy thuộc vào người lập trình. Nếu một giá trị đặc biệt được dùng thường xuyên (ví dụ giá trị điều khiển của một vịng lặp), lớp lưu trữ của nó có thể khai báo là register. Sau đó nếu trình biên dịch tìm thấy một thanh ghi cịn trống, và các thanh ghi của máy tính đủ lớn để chứa biến, biến sẽ được đặt vào thanh ghi đó. Ngược lại, trình biên dịch sẽ xem các biến thanh ghi như các biến động khác, nghĩa là lưu trữ chúng trong bộ nhớ. Từ khóa register được dùng khi định nghĩa các biến thanh ghi.
Phạm vi và sự khởi tạo của các biến thanh ghi là giống như các biến động, ngoại trừ vị trí lưu
trữ. Các biến thanh ghi là cục bộ trong một hàm. Nghĩa là, chúng tồn tại khi hàm được gọi và giá trị bị mất đi một khi thoát khỏi hàm. Sự khởi tạo các biến này được thực hiện bởi người lập trình. Vì số lượng các thanh ghi là có hạn, lập trình viên cần xác định các biến nào trong chương trình được sử dụng thường xuyên để khai báo chúng là các biến thanh ghi.
Sự hữu dụng của các biến thanh ghi thay đổi từ máy này đến một máy khác và từ một trình biên dịch C này đến một trình biên dịch khác. Đơi khi các biến thanh ghi không được hỗ trợ bởi tất cả – từ khóa register vẫn được chấp nhận nhưng được xem giống như là từ khóa auto. Trong các
trường hợp khác, nếu biến thanh ghi được hỗ trợ và nếu lập trình viên sử dụng chúng một cách hợp lý, chương trình sẽ được thực thi nhanh hơn gấp đôi.
Các biến thanh ghi được khai báo như bên dưới: register int x;
register char c;
Sự khai báo thanh ghi chỉ có thể gắn vào các biến động và tham số hình thức. Trong trường hợp sau, sự khai báo sẽ giống như sau:
f(c,n) register int c, n; { register int i; . . . }
Xét một ví dụ, ở đó chương trình hiển thị tổng lập phương các số thành phần của một số bằng chính số đó. Ví dụ 370 là một số như vậy, vì:
33 + 73 + 03 = 27 + 343 + 0 = 370
Chương trình sau in ra các con số như vậy trong khoảng 1 đến 999. #include <stdio.h>
main() {
register int i; int no, digit, sum;
printf(“\nThe numbers whose Sum of Cubes of Digits is Equal to the number itself are:\n\n”);
for(i = 1; i < 999; i++) { sum = 0; no = i; while(no) { digit = no%10; no = no/10;
sum = sum + digit * digit * digit; }
if (sum == i)
printf(“t%d\n”, i); }
}
Kết quả của chương trình trên như sau:
The numbers whose Sum of Cubes of Digits is Equal to the number itself are:
1 153 370 371 407
Trong chương trình trên, giá trị của i , thay đổi từ 1 đến 999. Với mỗi giá trị này, lập phương của từng con số riêng lẻ được cộng và kết quả tổng được so sánh với i. Nếu hai giá trị này là bằng nhau, i được hiển thị. Vì i được sử dụng để điều khiển sự lặp, (phần chính của chương trình), nó được khai báo là của lớp lưu trữ thanh ghi. Sự khai báo này làm tăng hiệu quả của chương trình.