Biến trong C là tên được đặt cho một vùng lưu trữ mà các chương trình của chúng ta có thể thao tác. Mỗi biến trong C có một kiểu cụ thể, xác định kích thước và bố cục bộ nhớ của biến, phạm vi của các giá trị có thể được lưu trữ trong bộ nhớ đó và tập hợp các hoạt động có thể được áp dụng cho biến.
Tên của một biến có thể bao gồm các chữ cái, chữ số và ký tự gạch dưới. Nó phải bắt đầu bằng chữ cái hoặc dấu gạch dưới.Đặc biệt trong lập trình C chữ hoa và chữ thường khác biệt vì vậy cần chú ý phân biệt chữ hoa chữ thường. Dựa trên các kiểu cơ bản được giải thích trong chương trước, sẽ có các kiểu biến cơ bản sau:
STT |
Phân loại và mô tả |
1 |
Char: Thông thường một octet đơn (một byte). Đây là một loại số nguyên. |
2 |
Int: Kích thước tự nhiên nhất của số nguyên cho máy. |
3 |
Float: Giá trị dấu phẩy động chính xác đơn. |
4 |
Double: Giá trị dấu phẩy động kép chính xác. |
5 |
Void: Đại diện cho sự vắng mặt của loại. |
Ngôn ngữ lập trình C cũng cho phép xác định các loại biến khác nhau, mà chúng ta sẽ đề cập đến trong các chương tiếp theo như liệt kê, con trỏ, mảng, cấu trúc, liên kết,... Trong bài này, chúng ta sẽ đi nghiên cứu các kiểu biến cơ bản.
Biến được định nghĩa là thông báo với trình biên dịch nơi và cách tạo lưu trữ cho biến đó. Biến xác định một kiểu dữ liệu và chứa một danh sách của một hoặc nhiều kiểu như sau:
type variable_list;
Một biến hợp lệ bao gồm: char, w_char, int, float, double, bool hoặc bất kỳ đối tượng nào do người dùng định nghĩa và variable_list có thể bao gồm một hoặc nhiều tên, số nhận dạng được phân tách bằng dấu phẩy. Một số khai báo hợp lệ được hiển thị ở đây:
int i, j, k;
char c, ch;
float f, salary;
double d;
Dòng int i, j, k; khai báo và định nghĩa các biến i, j và k; hướng dẫn trình biên dịch tạo các biến có tên là i, j và k của kiểu int.
Các biến có thể được khởi tạo (gán một giá trị ban đầu) trong khai báo của chúng. Trình khởi tạo bao gồm một dấu bằng, theo sau là một biểu thức liên tục như sau:
type variable_name = value;
Một số ví dụ:
extern int d = 3, f = 5; // declaration of d and f.
int d = 3, f = 5; // definition and initializing d and f.
byte z = 22; // definition and initializes z.
char x = 'x'; // the variable x has the value 'x'.
Đối với definition không có bộ khởi tạo: các biến có thời gian lưu trữ tĩnh được khởi tạo ngầm với NULL (tất cả các byte có giá trị 0) giá trị ban đầu của tất cả các biến khác là không xác định.
Khai báo biến đảm bảo cung cấp cho trình biên dịch rằng tồn tại một biến với kiểu và tên đã cho để trình biên dịch có thể tiến hành biên dịch thêm mà không yêu cầu chi tiết đầy đủ về biến.
Một khai báo biến hiệu quả khi bạn đang sử dụng nhiều tệp và bạn xác định biến của mình trong một trong các tệp sẽ có sẵn tại thời điểm liên kết của chương trình. Bạn sẽ sử dụng từ khóa extern để khai báo một biến ở bất kỳ nơi nào. Mặc dù bạn có thể khai báo một biến nhiều lần trong chương trình C của bạn, nó có thể được xác định chỉ một lần trong một tệp, một hàm hoặc một khối mã.
Thí dụ
Hãy thử ví dụ sau, trong đó các biến đã được khai báo ở trên cùng, nhưng chúng đã được xác định và được khởi tạo bên trong hàm chính:
#include
// Variable declaration:
extern int a, b;
extern int c;
extern float f;
int main () {
/* variable definition: */
int a, b;
int c;
float f;
/* actual initialization */
a = 10;
b = 20;
c = a + b;
printf("value of c : %d \n", c);
f = 70.0/3.0;
printf("value of f : %f \n", f);
return 0;
}
Khi mã trên được biên dịch và thực hiện, nó tạo ra kết quả sau:
value of c : 30
value of f : 23.333334
Cùng một khái niệm áp dụng trên khai báo hàm, trong đó bạn cung cấp tên hàm tại thời điểm khai báo và định nghĩa thực tế của nó có thể được đưa ra ở bất kỳ nơi nào khác.
Ví dụ:
// function declaration
int func();
int main() {
// function call
int i = func();
}
// function definition
int func() {
return 0;
}
Có hai loại biểu thức trong C:
Lvalue: Các biểu thức tham chiếu đến một vị trí bộ nhớ được gọi là các biểu thức "lvalue". Một giá trị có thể xuất hiện ở bên trái hoặc bên phải của một nhiệm vụ.
Rvalue: Giá trị rvalue đề cập đến một giá trị dữ liệu được lưu trữ tại một số địa chỉ trong bộ nhớ. Rvalue là một biểu thức mà không thể có một giá trị được gán cho nó có nghĩa là một rvalue có thể xuất hiện ở phía bên phải nhưng không xuất hiện ở phía bên trái của một nhiệm vụ.
Các biến là giá trị và do đó chúng có thể xuất hiện ở phía bên trái của một nhiệm vụ. Các chữ số là giá trị nhưng chúng không được gán và như vậy chúng không thể xuất hiện ở phía bên trái. Hãy xem các câu lệnh hợp lệ và không hợp lệ sau đây:
int g = 20; // valid statement
10 = 20; // invalid statement; would generate compile-time error