Xem thêm

Bài 8: Tận hưởng sự mê hoặc của các toán tử trong lập trình C

Huy Erick
Trong bài viết này, chúng ta sẽ khám phá cách sử dụng các toán tử trong lập trình C. Cùng tìm hiểu ý nghĩa của toán tử và các loại toán tử phổ biến mà...

Trong bài viết này, chúng ta sẽ khám phá cách sử dụng các toán tử trong lập trình C. Cùng tìm hiểu ý nghĩa của toán tử và các loại toán tử phổ biến mà chúng ta thường sử dụng. Đây là một phần kiến thức quan trọng mà chúng ta nên nắm vững!

Toán tử là gì?

Toán tử là các biểu tượng được sử dụng để chỉ cho trình biên dịch thực hiện các phép toán hoặc các thao tác logic. Ngôn ngữ lập trình C cung cấp nhiều loại toán tử, bao gồm:

  • Toán tử số học
  • Toán tử gán
  • Toán tử quan hệ
  • Toán tử logic
  • Toán tử bit
  • Toán tử đặc biệt

Types of Operators in C and C

Toán tử số học

Toán tử số học hai thành phần

Bảng dưới đây liệt kê tất cả các toán tử số học được hỗ trợ bởi ngôn ngữ C. Các toán tử này được sử dụng để thực hiện các phép cộng, trừ, nhân, chia và lấy số dư trên các giá trị số (biến và hằng số). Đây được gọi là các toán tử hai ngôi vì chúng đòi hỏi sự tham gia của hai giá trị số.

Toán tử Ý nghĩa
+ Phép cộng
- Phép trừ
* Phép nhân
/ Phép chia
% Phép lấy số dư (chỉ áp dụng cho số nguyên)

Ví dụ:

#include 
int main(){
  int a, b;
  printf("Nhập số a = ");
  scanf("%d", &a);
  printf("Nhập số b = ");
  scanf("%d", &b);

  // Phép cộng
  int sum = a + b;
  printf("Phép cộng: %d + %d = %d", a, b, sum);

  // Phép trừ
  int sub = a - b;
  printf("Phép trừ: %d - %d = %d", a, b, sub);

  // Phép nhân
  int mul = a * b;
  printf("Phép nhân: %d * %d = %d", a, b, mul);

  // Phép chia
  float div = a / (float)b;
  printf("Phép chia: %d / %d = %f", a, b, div);

  // Phép lấy số dư
  int mod = a % b;
  printf("Phép lấy số dư: %d %% %d = %d", a, b, mod);
}

Kết quả:

toan tu

Toán tử tăng giảm

Toán tử tăng, giảm là một loại toán tử một ngôi, bao gồm:

  • Toán tử ++: Tăng giá trị lên 1 đơn vị
  • Toán tử --: Giảm giá trị đi 1 đơn vị

Khi sử dụng toán tử tăng, giảm trong một lệnh đơn lẻ, chúng sẽ cho kết quả giống nhau. Tuy nhiên, nếu sử dụng toán tử tăng, giảm trong một biểu thức khác, kết quả sẽ khác nhau. Hãy xem xét ví dụ sau về việc tăng, giảm biến a:

#include 
int main(){
  int a;

  // Toán tử ++
  a = 5;
  a++;
  printf("a++ = %d\n", a);

  a = 5;
  ++a;
  printf("++a = %d\n", a);

  // Toán tử --
  a = 5;
  a--;
  printf("a-- = %d\n", a);

  a = 5;
  --a;
  printf("--a = %d\n", a);

  // Sử dụng toán tử tăng, giảm phía trước và sau biến trong một biểu thức khác
  a = 5;
  printf("Với a = %d trong lệnh printf\n", a);

  a = 5;
  printf("++a = %d\n", ++a);

  a = 5;
  printf("--a = %d\n", --a);

  a = 5;
  printf("a++ = %d\n", a++);

  a = 5;
  printf("a-- = %d\n", a--);
}

Kết quả:

toan tu 2

Toán tử gán

Toán tử gán được sử dụng để gán một giá trị cho một biến. Cú pháp: = ; hoặc = ;

Ngoài ra, toán tử gán cũng được sử dụng khi thực hiện tính toán với một biến.

Toán tử Viết gọn Viết đầy đủ
= a = b a = b
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b

Ví dụ:

#include 
int main(){
  int a = 5, c;

  c = a; // c is 5
  printf("c = %d\n", c);

  c += a; // c is 10 => c = c + a
  printf("c = %d\n", c);

  c -= a; // c is 5 => c = c - a
  printf("c = %d\n", c);

  c *= a; // c is 25 => c = c * a
  printf("c = %d\n", c);

  c /= a; // c is 5 => c = c / a
  printf("c = %d\n", c);

  c %= a; // c is 0 => c = c % a
  printf("c = %d\n", c);

  return 0;
}

Kết quả:

toan tu 3

Toán tử quan hệ (Relational Operators) hay toán tử so sánh

Toán tử quan hệ hay so sánh được sử dụng để so sánh giữa các số, biến và hằng số. Giá trị trả về là đúng (true) hoặc sai (false), tương ứng với 1 và 0.

Các toán tử này thường được sử dụng làm điều kiện trong các lệnh so sánh như if, switch case hoặc vòng lặp while, for, mà chúng ta sẽ học trong các bài viết sau.

Toán tử Ý nghĩa Ví dụ
== So sánh bằng 7 == 3 cho kết quả là 0
> So sánh lớn hơn 5 > 1 cho kết quả là 1
< So sánh nhỏ hơn 5 < 2 cho kết quả là 0
!= So sánh khác 5 != 4 cho kết quả là 1
>= Lớn hơn hoặc bằng 8 >= 3 cho kết quả là 1
<= Nhỏ hơn hoặc bằng 5 <= 0 cho kết quả là 0

Ví dụ:

#include 
int main(){
  int a = 5, b = 5, c = 10;

  printf("%d == %d is %d\n", a, b, a == b);
  printf("%d == %d is %d\n", a, c, a == c);

  printf("%d > %d is %d\n", a, b, a > b);
  printf("%d > %d is %d\n", a, c, a > c);

  printf("%d < %d is %d\n", a, b, a < b);
  printf("%d < %d is %d\n", a, c, a < c);

  printf("%d != %d is %d\n", a, b, a != b);
  printf("%d != %d is %d\n", a, c, a != c);

  printf("%d >= %d is %d\n", a, b, a >= b);
  printf("%d >= %d is %d\n", a, c, a >= c);

  printf("%d <= %d is %d\n", a, b, a <= b);
  printf("%d <= %d is %d\n", a, c, a <= c);
}

Kết quả:

toan tu 6

Toán tử logic (Logic Operators) hay so sánh logic

Toán tử logic sử dụng các mệnh đề logic để so sánh hai phần tử logic và trả về kết quả logic (true hoặc false), tương ứng với 1 và 0.

Các toán tử này thường được sử dụng để kết hợp các điều kiện trong các lệnh so sánh như if, switch case hoặc vòng lặp while, for.

  • Toán tử &&: Là toán tử AND, trả về true khi và chỉ khi cả hai toán hạng đều đúng.
  • Toán tử ||: Là toán tử OR, trả về true nếu có ít nhất một toán hạng đúng.
  • Toán tử !: Là toán tử NOT, phủ định giá trị của toán hạng.

AND

(a > 0 && a < 10). Nếu a lớn hơn 0 và nhỏ hơn 10, kết quả là true. Các trường hợp khác sẽ trả về false.

#include 
int main(){
  int a;
  printf("Nhập a = ");
  scanf("%d", &a);
  printf("%d\n", (a > 0 && a < 10));
}

Kết quả:

toan tu 4 1

OR

(a > 15 || a < 10). Nếu a lớn hơn 15 hoặc a nhỏ hơn 10, kết quả là true. Nếu không thỏa mãn cả hai điều kiện, kết quả sẽ là false.

#include 
int main(){
  int a;
  printf("Nhập a = ");
  scanf("%d", &a);
  printf("%d\n", (a > 15 || a < 10));
}

Kết quả:

toan tu 5

NOT

!a. Sẽ trả về 0 nếu a = 1, trả về 1 nếu a = 0. Nó chỉ đơn giản là đảo ngược giá trị. Lưu ý rằng khi sử dụng NOT với các số lớn hơn 1, kết quả vẫn tương tự. Ví dụ, nếu a = 255, thì !a = 0, nếu a = 0, thì !a sẽ bằng 1.

Ví dụ:

#include 
int main(){
  int a;
  printf("Nhập a = ");
  scanf("%d", &a);
  printf("%d\n", !a);
}

Kết quả:

toan tu 7

Toán tử thao tác bit (Bitwise Operators)

Toán tử thao tác bit hoạt động trên các bit, tính toán biểu thức bit theo từng bit.

Phép đảo và dịch

Có 3 toán tử một ngôi thao tác bit:

  • ~: Toán tử đảo, đảo ngược bit 0 thành 1 và ngược lại.
  • <<: Toán tử dịch trái. Giá trị bên trái được dịch chuyển sang trái bởi số lượng bit xác định bởi giá trị bên phải.
  • : Toán tử dịch phải. Giá trị bên trái được dịch chuyển sang phải bởi số lượng bit xác định bởi giá trị bên phải.

Ví dụ: A = 0011 1100

  • ~A = 1100 0011: tương ứng với -61
  • A<<2 = 1111 0000: tương ứng với 240
  • A>>2 = 0000 1111: tương ứng với 15

Phép toán logic

Bảng dưới đây liệt kê các toán tử thao tác bit hai ngôi là & (AND), | (OR) và ^ (XOR):

A B A & B A OR B A XOR B
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

Ví dụ: Giả sử A = 60 và B = 13, biểu diễn ở dạng nhị phân sẽ như sau:

A = 0011 1100

B = 0000 1101


A&B = 0000 1100: tương ứng là 12

A|B = 0011 1101: tương ứng là 61

A^B = 0011 0001: tương ứng là 49

#include 
int main() {
  printf("Toán tử thao tác bit\n");
  int a = 60, b = 13;
  printf("Bitwise AND operation %d & %d : %d\n",a,b,a&b);
  printf("Bitwise OR operation %d | %d : %d\n",a,b,a|b);
  printf("Bitwise XOR operation %d ^ %d : %d\n",a,b,a^b);
  printf("Bitwise ONE'S COMPLEMENT ~ %d operation : %d\n",a,~a);
  return 0;
}

Kết quả:

toan tu 8

Các toán tử hỗn hợp (Miscellaneous Operators)

Các toán tử đặc biệt được sử dụng trong các trường hợp cụ thể như:

  • &: Trả về địa chỉ của một biến. &a sẽ trả về địa chỉ thực sự của biến a.
  • : Trỏ tới một biến. a sẽ trỏ tới biến a.
  • ?: Biểu thức điều kiện tam phân. Nếu điều kiện là true thì giá trị X, ngược lại thì giá trị Y.

Kết

Việc nắm vững đặc tính và cách sử dụng các toán tử trong lập trình C là một bước quan trọng cho bất kỳ lập trình viên nào. Đây là kiến thức then chốt, luôn tồn tại trong quá trình học lập trình. Hy vọng rằng bạn đã hiểu về các toán tử trong lập trình C và tiếp tục khám phá các bài viết tiếp theo trong Serie Học lập trình C từ A đến Z.

Nếu bạn thấy bài viết hữu ích, hãy chia sẻ và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi thêm!

1