Cơ Bản Về Toán Tử, Biểu Thức Và Cú Pháp Trong Ngôn Ngữ C

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)

  1. 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)
  2. Toán tử đơn ngôi: +, -, ++, --, ~, * (giá trị tại địa chỉ), & (địa chỉ), sizeof, !
  3. Toán tử số học bậc cao: *, /, %
  4. Toán tử số học bậc thấp: +, -
  5. Dịch chuyển bit: <<, >>
  6. So sánh: <, >, <=, >=
  7. Bằng/khác: ==, !=
  8. AND bit: &
  9. XOR bit: ^ — kết quả là 1 nếu hai bit khác nhau, 0 nếu giống nhau
  10. OR bit: |
  11. AND luận lý: &&
  12. OR luận lý: ||
  13. Toán tử điều kiện: ? :
  14. Gán: =, +=, -=, *=, /=, %=
  15. 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 0sai (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 đương 15 thập phân)
  • Hệ thập lục phân: bắt đầu bằng 0x hoặc 0X — 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à 10b1011 & 0b1100 → 0b1000
|OR bit: kết quả là 1 nếu ít nhất một bit là 10b1011 | 0b1100 → 0b1111
^XOR bit: 1 khi hai bit khác nhau0b1011 ^ 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ải0b0001 << 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 & 3a % 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 & 3 giữ lại hai bit thấp nhất của a (vì 3 nhị phân là 11)
  • a % 4 cũng chỉ phụ thuộc vào hai bit thấp nhất — do 4 = 2², phần dư khi chia cho 4 luô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ủa a++
  • int(12.3 % 4)sai: toán tử % không áp dụng cho số thực
  • a = a + 7 = c + bsai: 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,900 khô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 C
  • int(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ọi fopen(); 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 struct thì 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
  • static khai 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

Thẻ: C-Language Operators expressions bitwise-operations pointers

Đăng vào ngày 14 tháng 6 lúc 21:38