Trọng số của toán tử trong C

Xin chào các bạn học lập trình! Hôm nay, chúng ta sẽ cùng khám phá thế giới kỳ thú của trọng số toán tử trong C. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn từng bước, giống như tôi đã làm cho hàng trăm học viên trong những năm dạy học của mình. Hãy cùng bắt đầu hành trình này nhé!

C - Operator Precedence

什么是运算符优先级?

Hãy tưởng tượng bạn đang ở trong nhà bếp, làm theo một công thức nấu ăn. Thứ tự mà bạn thêm nguyên liệu và thực hiện các hành động có thể ảnh hưởng lớn đến món ăn cuối cùng. Tương tự, trong lập trình C, thứ tự thực hiện các thao tác có thể ảnh hưởng rất nhiều đến kết quả của mã của bạn. Đây là lúc trọng số toán tử phát huy tác dụng.

Trọng số toán tử xác định thứ tự mà các toán tử khác nhau được đánh giá trong một biểu thức. Nó giống như một bộ quy tắc mà trình biên dịch tuân theo để quyết định thao tác nào cần thực hiện trước.

Hãy xem một ví dụ đơn giản:

int result = 5 + 3 * 2;

Bạn nghĩ giá trị của result sẽ là gì? Nếu bạn đoán là 11, bạn đã đúng! Nhưng tại sao?

Toán tử nhân * có trọng số cao hơn toán tử cộng +. Vậy nên, 3 * 2 được đánh giá trước (đưa ra 6), và sau đó 5 được cộng vào.

Nếu chúng ta muốn thay đổi thứ tự các thao tác, chúng ta có thể sử dụng dấu ngoặc:

int result = (5 + 3) * 2;

Bây giờ, result sẽ là 16, vì dấu ngoặc ép phép cộng được thực hiện trước.

Bảng trọng số

Để giúp bạn nhớ trọng số của các toán tử khác nhau trong C, hãy cùng nhìn vào bảng này. Các toán tử ở trên bảng có trọng số cao hơn.

Trọng số Toán tử Mô tả
1 () [] -> . Dấu ngoặc, chỉ mục mảng, truy cập thành viên
2 ! ~ ++ -- + - * & (type) sizeof Toán tử một ngôi, sizeof, ép kiểu
3 * / % Nhân, chia, modulus
4 + - Cộng, trừ
5 << >> Dịch bit trái và phải
6 < <= > >= Toán tử quan hệ
7 == != Toán tử bình đẳng
8 & Bitwise AND
9 ^ Bitwise XOR
10 | Bitwise OR
11 && Logical AND
12 || Logical OR
13 ?: Toán tử điều kiện
14 = += -= *= /= %= &= ^= = <<= >>=
15 , Toán tử phẩy

Đừng lo lắng nếu điều này trông quá phức tạp - chúng ta sẽ phân tích nó với các ví dụ!

Ví dụ về trọng số toán tử

Hãy nhìn vào một số ví dụ để hiểu cách trọng số toán tử hoạt động trong thực tế.

Ví dụ 1: Toán tử số học

int result = 10 + 5 * 2 - 3 / 2;

Để đánh giá biểu thức này:

  1. Đầu tiên, 5 * 2 được tính (10)
  2. Sau đó, 3 / 2 được tính (1, vì phép chia nguyên số cắt bỏ phần thập phân)
  3. Cuối cùng, chúng ta có 10 + 10 - 1, bằng 19

Vậy result sẽ là 19.

Ví dụ 2: Kết hợp toán tử số học và quan hệ

int x = 5;
int y = 3;
int z = 2;
int result = x > y + z && y < x * z;

Hãy phân tích này:

  1. y + z được đánh giá trước (3 + 2 = 5)
  2. x * z được tính (5 * 2 = 10)
  3. x > y + z trở thành 5 > 5, là false (0)
  4. y < x * z trở thành 3 < 10, là true (1)
  5. Cuối cùng, 0 && 1 được đánh giá, là false (0)

Vậy result sẽ là 0 (false).

Tính chất liên kết

Bây giờ chúng ta đã涵盖 trọng số, hãy nói về tính chất liên kết. Khi các toán tử có cùng trọng số, tính chất liên kết xác định thứ tự đánh giá.

Có hai loại tính chất liên kết:

  1. Trái sang phải
  2. Phải sang trái

Most operators in C are left-to-right associative, meaning they are evaluated from left to right. However, some operators, like assignment operators, are right-to-left associative.

Ví dụ của tính chất liên kết trái sang phải

int a = 10 - 5 - 3;

Điều này được đánh giá như (10 - 5) - 3, kết quả là 2.

Ví dụ của tính chất liên kết phải sang trái

int x, y, z;
x = y = z = 5;

Điều này được đánh giá như x = (y = (z = 5)), gán 5 cho tất cả ba biến.

Trọng số của toán tử tăng/giảm sau và trước

Bây giờ, hãy giải quyết một chủ đề khó khăn: toán tử tăng và giảm. Các toán tử này có thể được sử dụng theo hai cách: trước biến (prefix) và sau biến (postfix).

  • Prefix: ++x hoặc --x
  • Postfix: x++ hoặc x--

Các phiên bản prefix có trọng số cao hơn các phiên bản postfix. Hãy xem cách này hoạt động trong mã:

int x = 5;
int y = ++x * 2;

Ở đây, x được tăng lên 6 trước khi nhân, vì vậy y trở thành 12.

Bây giờ, hãy thay đổi nó thành postfix:

int x = 5;
int y = x++ * 2;

Trong trường hợp này, x được sử dụng trong phép nhân trước khi tăng, vì vậy y trở thành 10, và x là 6 sau thao tác.

Một ví dụ thú vị

Hãy tưởng tượng toán tử prefix như việc bạn mang giày trước khi ra khỏi nhà, trong khi toán tử postfix là việc bạn lấy giày và mang chúng sau khi đã ra khỏi nhà. Prefix thực hiện công việc ngay lập tức, trong khi postfix chờ đợi sau hành động chính.

Kết luận

Hiểu rõ trọng số và tính chất liên kết của toán tử là rất quan trọng để viết các chương trình C chính xác và hiệu quả. Nó giống như việc học ngữ pháp của một ngôn ngữ mới - có thể trông phức tạp ban đầu, nhưng với sự luyện tập, nó sẽ trở thành bản năng thứ hai.

Nhớ rằng, khi nghi ngờ, hãy sử dụng dấu ngoặc để làm rõ ý định của bạn. Điều này không chỉ đảm bảo mã của bạn hoạt động như mong đợi, mà còn làm cho nó dễ đọc hơn cho người khác (và chính bạn trong tương lai!).

Tiếp tục luyện tập, và sớm bạn sẽ điều khiển thế giới các toán tử C như một đầu bếp chuyên nghiệp trong nhà bếp - biết chính xác khi nào thêm mỗi nguyên liệu để có kết quả hoàn hảo!

Credits: Image by storyset