Trong bài này chúng ta sẽ học cách sử dụng các toán tử trong lập trình C. Toán tử là gì, có các loại toán tử nào chúng ta thường hay sử dụng. Đây cũng là một phần rất quan trọng, các bạn nên học thật kĩ nhé!
Toán tử là gì?
Toán tử là một biểu tượng mà nói với trình biên dịch thực hiện một phép toán học nhất định hoặc thao tác hợp lý. Ngôn ngữ C có sẵn rất nhiều toán tử và cung cấp các kiểu toán tử sau đây:
- 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
Toán tử số học (Arithmetic Operators)
Toán tử số học 2 thành phần
Bảng dưới đây chỉ ra tất cả các toán tử số học được hỗ trợ bởi ngôn ngữ C. Được sử dụng để thực hiện các phép toán: cộng, trừ, nhân, chia,… trên các giá trị số (biến và hằng). Đây là các toán tử cần sự tham gia của 2 giá trị số nên được phân loại là các toán tử 2 ngôi.
Toán tử | Ý nghĩa |
---|---|
+ | phép toán cộng |
– | phép toán trừ |
* | phép toán nhân |
/ | phép toán chia |
% | phép toán lấy số dư(chỉ áp dụng cho số nguyên) |
VD:
#include <stdio.h> int main(){ int a, b; printf("\nNhập số a = "); scanf("%d", &a); // Lưu ý nhập b != 0 printf("\nNhập số b b = "); scanf("%d", &b); // Phép (+) int sum = a + b; printf("\nPhép cộng: %d + %d = %d", a, b, sum); // Phép (-) int sub = a - b; printf("\nPhép trừ:%d - %d = %d", a, b, sub); // Phép (*) int mul = a * b; printf("\nPhép nhân:%d * %d = %d", a, b, mul); // Phép (/) float div = a / (float)b; printf("\nPhép chia:%d / %d = %f", a, b, div); // Phép (%) int mod = a % b; printf("\nPhép chia lấy số dư: %d %% %d = %d", a, b, mod); }
Kết quả
Toán tử tăng giảm
Toán tử tăng, giảm là 1 loại toán tử 1 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 đặt toán tử tăng giảm ở một lệnh riêng biệt, chúng cho ra kết quả như nhau.
Nhưng nếu đặt phép tăng, giảm trong một biểu thức lệnh khác kết quả sẽ khác nhau. Xét trường hợp tăng giảm biến a
- Với a++ và a–: Chương trình sẽ thực hiện lệnh với a sau đó mới thực hiện tăng và giảm biến a
- Với ++a và –a: Chương trình sẽ thực hiện tăng/giảm biến a sau đó mới thực hiện lệnh
VD:
#include <stdio.h> int main(){ int a; // Toán tử ++ với a = 5 a = 5; a++; printf("a++ = %d \n", a); a = 5; ++a; printf("++a = %d \n", a); //Toán tử -- với a = 5 a = 5; a--; printf("a-- = %d \n", a); a = 5; --a; printf("--a = %d \n", a); //Dùng toán tử tăng giảm phía trước và sau biến trong một lệnh khác a = 5; printf("Voi a = %d trong lenh 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ả
Toán tử gán (Assignment Operators)
Toán tử gán dùng để gán 1 giá trị cho 1 biến. Cú pháp: <Biến A> = <Giá trị>;
hoặc <Biến A> = <BiếnB>;
Ngoài ra toán tử gán còn sử dụng khi sử dụng chính nó để tính toán với một biến khác.
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 |
VD:
#include <stdio.h> 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 = 0 => c = c % a printf("c = %d\n", c); return 0; }
Kết quả
Toán tử quan hệ (Relational Operators) hay toán tử so sánh
Toán tử quan hệ hay so sánh sử dụng các phép toán so sánh giữa các số, biến và hằng. Giá trị trả về là logic (true
hoặc false
tương ứng với 1 hoặc 0)
Các toán tử này sử dụng làm điều kiện trong các lệnh so sánh như if, case hoặc while, for sẽ học trong các bài 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 |
VD:
#include <stdio.h> 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ả:
Toán tử Logic (Logic Operators) hay so sánh logic
Toán tử logic là toán tử sử dụng các mệnh đề logic để so sánh 2 phần tử logic, giá trị trả về là logic (true
hoặc false
tương ứng với 1 hoặc 0)
Các toán tử này thường được sử dụng để nối các điều kiện trong các lệnh so sánh như if, case hoặc while, for.
- Toán tử
&&
: là toán tử AND, trả vềtrue
khi và chỉ khi tất cả các toán hạng đều đúng. - Toán tử
||
: là toán tử OR, trả vềtrue
khi có ít nhất 1 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à a < 10 thì ra giá trị true, các giá trị còn lại sẽ ra giá trị false. Hoặc nói đơn giản là thỏa mãn cả 2 điều kiện
#include <stdio.h> int main(){ int a; printf("nhap a = "); scanf("%d", &a); printf("\n%d", (a > 0 && a < 10)); }
Kết quả
OR
(a > 15 || a < 10). Nếu a lớn hơn 5 hoặc a = 10 thì true, nếu không thỏa mãn cả 2 điều kiện thì là false
#include <stdio.h> int main(){ int a; printf("nhap a = "); scanf("%d", &a); printf("\n%d", (a > 15 || a < 10)); }
Kết quả
NOT
!a. Sẽ trả về 0 nếu a = 1, trả về 1 nếu a = 0. Nó đơn giản chỉ là đảo ngược. Lưu ý khi ta sử dụng NOT với các số lớn hơn 1 thì kết quả cũng tương tư.
Ví dụ: nếu a = 255 thì !a = 0, nếu a = 0 thì !a sẽ bằng 1.
Toán tử thao tác bit ( Bitwise Operators )
Toán tử thao tác bit làm việc trên đơn vị bit, tính toán biểu thức theo từng bit
Phép đảo và dịch
Có 3 toán tử 1 ngôi thao tác theo 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ị toán hạng trái được dịch chuyển sang trái bởi số các bit được xác định bởi toán hạng bên phải
- >>: Toán tử dịch phải. Giá trị toán hạng trái được dịch chuyển sang phải bởi số các bit được xác định bởi toán hạng bên phải
VD: 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
Ngoài ra toán tử dịch 1 bit còn được viết gọn như sau: <<A hoặc >>A
Phép toán logic
Bảng dưới đây về toán tử thao tác bit 2 ngôi là & (AND) , | (OR), và ^ (NOR) như sau:
A | B | A & B | A | B | A ^ B |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
VD: Giả sử nếu A = 60; và B = 13; thì bây giờ trong định dạng nhị phân chúng sẽ là 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à 12
A^B = 0011 0001: tương ứng là 49
#include <stdio.h> int main() { printf("Toan tu thao tac bit \n\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ả
Các toán tử hỗn hợp (Miscellaneous Operators)
Các toán tử đặc biệt dùng trong các trường hợp nhất định như
& | Trả lại địa chỉ của một biến. | &a; sẽ cho đị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 : Nếu không thì giá trị Y |
Kết
Nắm rõ đặc tính và cách sử dụng các toán tử trong lập trình C là một việc bất kì lập trình viên nào đều phải học. Đây là một kiến thức rất quan trọng, xuyên xuốt quá trình học lập trình.
Hi vọng các bạn đã hiểu về nó, tiếp tục tới bài tiếp theo của Serie Học lập trình C từ A đến Z
Nếu thấy có ích hãy chia sẻ bài viết và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi nhé
Rất hay,cảm ơn anh !