Toán tử trong Ngôn ngữ C
Toán tử là một số các kí hiệu nhằm giúp C thực hiện phép toán học nhất định. 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ử hỗn hợp
Toán tử số học (Arithmetic Operators)
Toán tử số học là một loại toán tử đượ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) |
Ví dụ code minh hoạ:
#include <stdio.h> int main(){ int a, b; printf("\nNhap a = "); scanf("%d", &a); // Lưu ý nhập b != 0 printf("\nNhap b = "); scanf("%d", &b); // Phép (+) int sum = a + b; printf("\n%d + %d = %d", a, b, sum); // Phép (-) int sub = a - b; printf("\n%d - %d = %d", a, b, sub); // Phép (*) int mul = a * b; printf("\n%d * %d = %d", a, b, mul); // Phép (/) float div = a / (float)b; // float div = a / b * 1.0; // float div = (float)a / b; // float div = (float)(a / b); // do not use printf("\n%d / %d = %f", a, b, div); // Phép (%) int mod = a % b; printf("\n%d %% %d = %d", a, b, mod); }
Toán tử tăng, giảm (Increment and Decrement)
Toán tử tăng, giảm là toán tử 1 ngôi, bao gồm 2 toán tử sau:
- Toán tử + +: Tăng giá trị lên 1 đơn vị.
- Toán tử – –: Giảm giá trị đi 1 đơn vị.
- 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.
Ví dụ code minh hoạ:
#include <stdio.h> int main(){ int a; printf("\nNhap a = "); scanf("%d", &a); // Toán tử ++ ++a; printf("\na++ = %d", a); // // Toán tử -- --a; printf("\na-- = %d", a); a = 5; printf("\na = %d", a); // Tiền tố và hậu tố a++ và ++a printf("\n++a = %d", ++a); a = 5; printf("\n--a = %d", --a); a = 5; printf("\na++ = %d", a++); a = 5; printf("\na-- = %d", a--); }
Toán tử gán (Assignment Operators)
Toán tử gán dùng để gán 1 giá trị cho 1 biến. Bao gồm các toán tử sau:
Cú pháp: <Biến A> = <Giá trị>; hoặc <Biến A> = <BiếnB>;
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ụ code minh hoạ:
#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; }
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).
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ụ code minh hoạ:
#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); }
Toán tử logic (Logical Operators)
Toán tử logic là một toán tử trong C. Toán tử logic bao gồm các toán tử sau:
- 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.
Ví dụ code minh hoạ:
#include <stdio.h> int main(){ int a = 5; printf("\n%d", (a > 0 && a % 2 == 0)); // 1 && 0 = 0 printf("\n%d", (a % 2 == 0 || a % 5 == 0)); // 0 || 1 = 1 printf("\n%d", !(a == 5)); // Tại sao không dùng & hay |? int b = 5; // dấu || printf("\n%d", (b == 5 || b++ > 0)); printf("\nb = %d", b); b = 5; printf("\n%d", (b == 5 | b++ > 0)); printf("\nb = %d", b); // dấu || b = 5; printf("\n%d", (b != 5 && b++ > 0)); printf("\nb = %d", b); b = 5; printf("\n%d", (b != 5 & b++ > 0)); printf("\nb = %d", b); }
Toán tử thao tác bit (Bitwise Operators)
Các toán tử dạng bit cho phép chúng ta thao tác trên từng bit riêng biệt trong các kiểu dữ liệu nguyên thủy. Giả sử A = 60 (= 0011 1100) và B = 13 (= 0000 1101).
Toán tử | Miêu tả | Ví dụ |
---|---|---|
& | Toán tử AND (và) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong cả hai toán hạng. | (A & B) sẽ cho kết quả là 12, tức là 0000 1100 |
| | Toán tử OR (hoặc) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong một hoặc hai toán hạng. | (A | B) sẽ cho kết quả là 61, tức là 0011 1101 |
^ | Toán tử XOR nhị phân sao chép bit mà nó chỉ tồn tại trong một toán hạng mà không phải cả hai. | (A ^ B) sẽ cho kết quả là 49, tức là 0011 0001 |
~ | Toán tử đảo bit (đảo bit 1 thành bit 0 và ngược lại). | (~A ) sẽ cho kết quả là -61, tức là 1100 0011. |
<< | 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. | A << 2 sẽ cho kết quả 240, tức là 1111 0000 (dịch sang trái hai bit) |
>> | 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. | A >> 2 sẽ cho kết quả là 15, tức là 0000 1111 (dịch sang phải hai bit) |
Toán tử hỗn hợp trong C
Có một số toán tử hỗn hợp quan trọng là sizeof và ? : được hỗ trợ bởi ngôn ngữ C.
Toán tử | Miêu tả | Ví dụ |
---|---|---|
sizeof() | Trả về kích cỡ biến | sizeof(a), với a là integer, thì sẽ trả lại kết quả là 4. |
& | Trả về địa chỉ biến. | &a; sẽ cho địa chỉ thực sự của biến a. |
* | Trỏ tới biến. | *a; sẽ trỏ tới biến a. |
? : | Biểu thức ĐK | Nếu ĐK là true ? thì giá trị X : Nếu không thì giá trị Y |
Thứ tự ưu tiên trong toán tử
Loại | Toán tử | Thứ tự ưu tiên |
---|---|---|
Postfix | () -> . ++ – – | Trái sang phải |
Unary | + – ! ~ ++ – – (type)* & sizeof | Phải sang trái |
Tính nhân | * / % | Trái sang phải |
Tính cộng | + – | Trái sang phải |
Dịch chuyển | << >> | Trái sang phải |
Quan hệ | < <= > >= | Trái sang phải |
Cân bằng | == != | Trái sang phải |
Phép AND bit | & | Trái sang phải |
Phép XOR bit | ^ | Trái sang phải |
Phép OR bit | | | Trái sang phải |
Phép AND logic | && | Trái sang phải |
Phép OR logic | || | Trái sang phải |
Điều kiện | ?: | Phải sang trái |
Gán | = += -= *= /= %=>>= <<= &= ^= |= | Phải sang trái |
Dấu phảy | , | Trái sang phải |
Câu lệnh điều kiện if – else
Mệnh đề if trong C
Mệnh đề if được sử dụng để kiểm tra giá trị dạng boolean của điều kiện. Khối lệnh sau if được thực thi nếu giá trị của điều kiện là True. Cú pháp:
if (condition) { // khối lệnh này được thực thi nếu condition = true }
Ví dụ code minh hoạ:
// 1. Chỉ có if // BT: Nhập vào 1 số nguyên, kiểm tra số đó có phải số chẵn hay ko? #include <stdio.h> int main(){ int a; printf("Nhap a = "); scanf("%d", &a); if (a % 2 == 0) // a chia hết cho 2 { printf("%d la so chan", a); } printf("\nXong!"); }
Mệnh đề if else trong C
if (condition){ // statement1 // khối lệnh sẽ thực hiện nếu điều kiện đúng }else{ // statement2 // khối lệnh sẽ thực hiện nếu điều kiện sai }
Ví dụ code minh hoạ:
// 2. Có if else // BT: Nhập vào 1 số nguyên, kiểm tra số đó có phải số chẵn hay số lẻ #include <stdio.h> int main(){ int a; printf("Nhap a = "); scanf("%d", &a); if (a % 2 == 0) // a chia hết cho 2 { printf("%d la so chan", a); }else{ printf("%d la so le", a); } }
Cấu trúc if … elseif … else
if (test expression1) { // statement(1) } else if(test expression2) { // statement(2) } else if (test expression3) { // statement(3) } . . else { // statement(n) }
Ví dụ code minh hoạ:
// 3. if else if // BT: Nhập vào hai số nguyên, đưa ra kết luận so sánh 2 số đó #include <stdio.h> int main(){ int a, b; printf("Nhap a = "); scanf("%d", &a); printf("Nhap b = "); scanf("%d", &b); // a, b if(a > b){ // printf("%d lon hon %d", a, b); }else if(a == b){ printf("%d bang %d", a, b); }else{ printf("%d nho hon %d", a, b); } }
Cấu trúc if else lồng nhau
Chính là việc bạn sử dụng một cấu trúc if else khác trong thân của một cấu trúc if else đã có. Xem ví dụ code sau đây để hiểu rõ hơn.
// 4. if else lồng nhau // BT: Nhập vào 1 số nguyên, kiểm tra số đó là số âm chẵn, âm lẻ, dương chẵn hay dương lẻ hay là số 0? #include <stdio.h> int main(){ int a; printf("Nhap a = "); scanf("%d", &a); if(a > 0){ // Số dương if(a % 2 == 0){ printf("Day la so duong chan!"); }else{ printf("Day la so duong le!"); } }else if(a == 0){ // Số 0 printf("Day la so 0!"); }else{ // Số âm if(a % 2 == 0){ printf("Day la so am chan!"); }else{ printf("Day la so am le!"); } } }
Câu lệnh rẽ nhánh switch – case
Lệnh switch case là một cấu trúc điều khiển & rẽ nhánh hoàn toàn có thể được thay thế bằng cấu trúc if else. Tuy nhiên, việc sử dụng switch case sẽ giúp code của chúng ta dễ viết và dễ đọc hơn; Một điều nữa là sử dụng switch case có vẻ như cho hiệu năng tốt hơn so với sử dụng if else.
Cú pháp của lệnh switch case:
switch (expression) { case constant1: // statements break; case constant2: // statements break; . . . default: // default statements }
- expression phải bắt buộc là giá trị hằng, có thể là biểu thức nhưng kết quả cần là hằng số.
- Trong đó, expression sẽ được tính toán 1 lần duy nhất và sau đó so sánh với các giá trị của các case.
- Nếu có 1 case nào đó khớp giá trị, các khối lệnh tương ứng sau case đó sẽ được thực hiện cho tới khi gặp lệnh break. Do đó, nếu chúng ta không sử dụng break thì tất cả các case kể từ case khớp giá trị đều được thực hiện.
- Case default sẽ được thực hiện nếu không có case nào khớp giá trị với expression.
Sơ đồ khối của lệnh switch case:
Ví dụ code minh hoạ:
//Nhap 2 so a, b va tinh tong, hieu, tich & thuong #include <stdio.h> int main() { int a, b; char opera; printf("\nNhap phep toan: "); scanf("%c", &opera); printf("\nNhap vao 2 so a, b: "); scanf("%d%d", &a, &b); switch (opera) { case '+': printf("%d + %d = %d", a, b, a + b); break; case '-': printf("%d - %d = %d", a, b, a - b); break; case '*': printf("%d * %d = %d", a, b, a * b); break; case '/': if(b == 0){ printf("Khong the chia cho 0!"); }else{ printf("%d / %d = %.2f", a, b, (float)a / b); } break; default: printf("Khong co phep toan %c!", opera); break; } }
Bài tập Minh hoạ
- Nhập một số bất kỳ. Hãy đọc giá trị của số nguyên đó nếu nó có giá trị từ 0 đến 9, ngược lại thông báo không đọc được.
- Nhập một chữ cái. Nếu là chữ thường thì đổi sang chữ hoa, ngược lại đổi sang chữ thường.
- Giải phương trình bậc nhất ax + b = 0.
- Giải phương trình bậc hai ax2 + bx + c = 0.
- Nhập 4 số nguyên a, b, c và d. Tìm số có giá trị nhỏ nhất (min).
- Nhập 4 số nguyên a, b, c và d. Hãy sắp xếp giá trị của 4 số nguyên này theo thứ tự tăng dần.
- Tính tiền đi taxi từ số km nhập vào. Biết:
- 1 km đầu giá 15000đ.
- Từ km thứ 2 đến km thứ 5 giá 13500đ.
- Từ km thứ 6 trở đi giá 11000đ.
- Nếu trên 120km được giảm 10% tổng tiền.
- Nhập vào tháng và năm. Cho biết tháng đó có bao nhiêu ngày.
- Nhập độ dài 3 cạnh 1 tam giác. Kiểm tra đó có phải là tam giác không và là tam giác gì?