Các biểu thức trong C được kết hợp với dấu chấm phẩy để tạo thành câu lệnh — ví dụ: x = 5; là một câu lệnh biểu thức. Tuy nhiên, bản thân x = 5 (không có dấu chấm phẩy) là một biểu thức có giá trị trả về là 5.
Chương trình C luôn bắt đầu thực thi từ hàm main(), không phải từ dòng đầu tiên của tệp nguồn. Đây là quy tắc bắt buộc do tiêu chuẩn ISO/IEC 9899.
Tên biến trong C phân biệt chữ hoa/chữ thường: count, Count, và COUNT là ba định danh khác nhau.
Thứ tự ưu tiên toán tử (từ cao đến thấp)
- Toán tử sơ cấp:
()(gọi hàm),[](truy cập mảng),.(truy cập thành viên cấu trúc),->(truy cập qua con trỏ cấu trúc) - Toán tử đơn ngôi:
+,-,++,--,~,*(giá trị tại địa chỉ),&(địa chỉ),sizeof,! - Toán tử số học bậc cao:
*,/,% - Toán tử số học bậc thấp:
+,- - Dịch chuyển bit:
<<,>> - So sánh:
<,>,<=,>= - Bằng/khác:
==,!= - AND bit:
& - XOR bit:
^— kết quả là1nếu hai bit khác nhau,0nếu giống nhau - OR bit:
| - AND luận lý:
&& - OR luận lý:
|| - Toán tử điều kiện:
? : - Gán:
=,+=,-=,*=,/=,%= - Dấu phẩy:
,— đánh giá từ trái sang phải; giá trị toàn bộ biểu thức là giá trị biểu thức cuối cùng
Ví dụ: int result = (val = 7, val * 2); gán 14 cho result, vì val nhận 7, sau đó val * 2 trả về 14.
Mã ASCII phổ biến
'0'→48'A'→65'a'→97
Điều kiện luận lý
Trong C, mọi giá trị khác 0 đều được coi là đúng (true), còn 0 là sai (false):
if (n) // đúng khi n != 0
if (!n) // đúng khi n == 0
Biểu diễn số nguyên
- Hệ bát phân: bắt đầu bằng
0— ví dụ:017(tương đương15thập phân) - Hệ thập lục phân: bắt đầu bằng
0xhoặc0X— ví dụ:0xFF(255) - Hệ thập phân: mặc định — ví dụ:
123
Phép toán bit cơ bản
| Toán tử | Mô tả | Ví dụ (8-bit) |
|---|---|---|
& | AND bit: giữ 1 chỉ khi cả hai bit đều là 1 | 0b1011 & 0b1100 → 0b1000 |
| | OR bit: kết quả là 1 nếu ít nhất một bit là 1 | 0b1011 | 0b1100 → 0b1111 |
^ | XOR bit: 1 khi hai bit khác nhau | 0b1011 ^ 0b1100 → 0b0111 |
~ | NOT bit: đảo toàn bộ bit | ~0b1011 → 0b0100 (trên 4 bit) |
<< | Dịch trái n vị trí: thêm 0 vào bên phải | 0b0001 << 2 → 0b0100 |
>> | Dịch phải n vị trí: bỏ bit phải, điền 0 (với số không dấu) | 0b1100 >> 1 → 0b0110 |
Mối quan hệ giữa a & 3 và a % 4
Với mọi số nguyên a, biểu thức (a & 3) == (a % 4) luôn trả về 1 (đúng). Lý do:
a & 3giữ lại hai bit thấp nhất củaa(vì3nhị phân là11)a % 4cũng chỉ phụ thuộc vào hai bit thấp nhất — do4 = 2², phần dư khi chia cho4luôn nằm trong khoảng[0, 3], tương ứng chính xác với giá trị của hai bit cuối
Biểu thức hợp lệ trong C
Xét các lựa chọn sau (giả sử tất cả biến đã khai báo):
a = a + 7;→ câu lệnh, không phải biểu thức (có dấu chấm phẩy)a = 7 + b + c, a++→ biểu thức hợp lệ, sử dụng toán tử dấu phẩy; giá trị là kết quả củaa++int(12.3 % 4)→ sai: toán tử%không áp dụng cho số thựca = a + 7 = c + b→ sai: vế trái của phép gán phải là l-value (ví dụ biến), không phải biểu thức
Ký tự hằng
Ký tự hằng được đặt trong dấu nháy đơn (' '):
- Hợp lệ:
'X','\n','\t','\x41'(ký tự 'A') - Không hợp lệ:
"A"(chuỗi),'\08'(số bát phân không chứa chữ số8),'\\'(thiếu ký tự thoát — phải là'\\\\')
Một số lưu ý cú pháp quan trọng
2,900không phải hằng số nguyên hợp lệ — dấu phẩy không được dùng làm dấu phân cách hàng nghìn trong Cint(5.5)sai cú pháp — ép kiểu đúng là(int)5.5-k++tương đương-(k++), không phải(-k)++- Tên định danh hợp lệ bắt đầu bằng chữ cái hoặc gạch dưới, theo sau bởi chữ cái/số/gạch dưới; không được trùng tên từ khóa như
for,return,main while (m = 0)sẽ không thực hiện thân vòng lặp dù một lần nào, vì điều kiện luôn là0(sai)
Con trỏ và mảng
Với khai báo int a[4][5];, biểu thức a[2] + 3 là con trỏ trỏ tới phần tử ở hàng 2, cột 3 — tức địa chỉ của a[2][3].
Với int a[10], *p = a;:
a[9]→ hợp lệ (phần tử cuối)p[5]→ hợp lệ (tương đương*(p + 5))*p++→ hợp lệ (lấy giá trị rồi tăng con trỏ)a++→ sai: tên mảng là hằng địa chỉ, không thể tăng
Hàm và giá trị trả về
Loại giá trị trả về của hàm do kiểu được khai báo trong phần định nghĩa hàm — ví dụ:
double compute() { return 3.14; } // trả về double
Giá trị mặc định nếu không khai báo kiểu là int. Hàm có thể chứa nhiều câu lệnh return, nhưng nếu hàm khai báo trả về giá trị thì phải đảm bảo luôn có ít nhất một return trả về giá trị phù hợp.
Tập tin và xử lý I/O
- Tập tin nhị phân hỗ trợ truy cập ngẫu nhiên; tập tin văn bản thường chỉ đọc tuần tự
- Hàm
fseek()chủ yếu dùng cho tập tin nhị phân hoặc tập tin văn bản ở chế độ nhị phân — không nên dùng với tập tin văn bản thông thường - Mở tập tin ở chế độ
"r"đặt con trỏ tại đầu tập tin - Con trỏ tập tin (
FILE *) chỉ tồn tại sau khi gọifopen(); nó không tự động thay đổi khi chuyển sang tập tin khác
Cấu trúc và kiểu dữ liệu đặc biệt
- Biến cấu trúc chiếm không gian bộ nhớ; bản thân định nghĩa
structthì không - Mảng cấu trúc chỉ chứa các phần tử cùng kiểu cấu trúc — không hỗ trợ hỗn hợp kiểu
- Giá trị của các hằng liệt kê (
enum) luôn là số nguyên statickhai báo biến tĩnh: tồn tại suốt thời gian chạy chương trình, khởi tạo một lần