1.Toán tử toán học
C cung cấp 5 toán tử toán học cơ bản
STT | Toán tử | Tên | Ví dụ | Kết quả |
---|---|---|---|---|
1 | + | Cộng | 4+12.6 | 16.6 |
2 | - | Trừ | 4-2.5 | 1.5 |
3 | * | Nhân | 4*2 | 8 |
4 | / | Chia | 6/3 | 2 |
5 | % | Lấy dư | 6%4 | 2 |
Thử làm 1 ví dụ:
#include <stdio.h> int main(){ int a = 5, b = 7; double c = 4.5, d = 6; printf("%d + %f = %f \n", a, c, a + c); printf("%d - %d = %d \n", a, b, a - b); printf("%d * %f = %f \n", b, d, b * d); /* Luu y phep chia nhe*/ printf("%d / %d = %d \n", b, a, b / a); printf("%f / %d = %f \n", c, a, c / a); printf("%f / %f = %f \n", c, d, c / d); printf("%d %% %d = %d \n", b, a, b % a); return 0; }
Kết quả
5 + 4.500000 = 9.500000
5 – 7 = -2
7 * 6.000000 = 42.000000
7 / 5 = 1
4.500000 / 5 = 0.900000
4.500000 / 6.000000 = 0.750000
7 % 5 = 2
Toán tử lấy phần dư (%) yêu cầu cả hai toán hạng là số nguyên. Nó trả về phần dư còn lại của phép chia. Ví dụ 7 % 5 được tính toán bằng cách chia số nguyên 7 cho 5 để được 1 và phần dư là 2; vì thế kết quả là 2.
Thông thường, nếu cả hai toán hạng là số nguyên sau đó kết quả sẽ là một số nguyên. Tuy nhiên, một hoặc cả hai toán hạng là số thực thì sau đó kết quả sẽ là một số thực.
Khi cả hai toán hạng của toán tử chia là số nguyên thì sau đó phép chia được thực hiện như là một phép chia số nguyên và không phải là phép chia thông thường mà chúng ta sử dụng. Phép chia số nguyên luôn cho kết quả là phần nguyên của thương. Ví dụ: 7 / 5 =1 chứ không phải 7 / 5 = 1.4. Để khắc phục lỗi này thì ta có thể chuyển một số hoặc cả 2 số sang kiểu thực rồi thực hiện phép chia. Cách chuyển kiểu (hay ép kiểu) ta như sau:
(kiểu cần chuyển) (biến).
(kiểu cần chuyển) (biến).
Lưu ý khi ép kiểu thế này thì kiểu của các biến ban đầu không thay đổi mà chỉ là giá trị tức thời (tại thời điểm đó thay đổi sang kiểu mới). Để lưu lại giá trị tức thời này bạn cần khai báo thêm một biến mới có kiểu cần chuyển và gán giá trị đó lại. Ví dụ cho dễ.
#include <stdio.h> int main(){ int a = 5, b = 7; double c; printf("%d / %d = %d \n", b, a, b / a); /* Chuyen gia tri tuc thoi cua b sang kieu so thuc*/ printf("%d / %d = %f \n", b, a, (double)b / a); /* Chuyen gia tri tuc thoi cua a sang kieu so thuc*/ printf("%d / %d = %f \n", b, a, b / (double)a); /* Neu lam the nay thi van khong dung, vi b/a duoc so nguyen * sau do chung ta moi ep kieu so nguyen do sang so thuc */ printf("%d / %d = %f \n", b, a, (double)(b / a)); return 0; }
Kết quả:
7 / 5 = 1
7 / 5 = 1.400000
7 / 5 = 1.400000
7 / 5 = 1.000000
2.Toán tử quan hệ
C cung cấp 6 toán tử quan hệ để so sánh các số. Các toán tử quan hệ trả về1 (thay cho kết quả đúng) hoặc 0 (thay cho kết quả sai).
STT | Toán tử | Tên | Ví dụ | Kết quả |
---|---|---|---|---|
1 | == | So sánh bằng | 5 == 5 | 1 |
2 | != | So sánh khác | 5 != 5 | 0 |
3 | > | So sánh lớn hơn | 5 > 4 | 1 |
4 | < | So sánh nhỏ hơn | 5 < 4 | 0 |
5 | >= | So sánh lớn hơn hoặc bằng | 5 >= 4 | 1 |
6 | <= | So sánh nhỏ hơn hoặc bằng | 5 <= 5 | 1 |
Chúng ta sử dụng các toán tử này để so sánh các giá trị, các ký tự,… tuy nhiên không so sánh các xâu với nhau vì điều này sẽ dẫn đến các địa chỉ của chuỗi được so sánh chứ không phải là nội dung chuỗi. Chúng ta có các hàm so sánh xâu ở thư viện string và sẽ tìm hiểu sau. Khi so sánh các ký tự với nhau thì bản chất ta có thể hiểu là máy so sánh các mã ASCII của các ký tự với nhau. VD. ‘A’ >’B’ sẽ trả về giá trị 0 vì ‘A’ có mã ASCII là 65 còn ‘B’ là 66.
3.Toán tử luận lý
C cung cấp ba toán tử luận lý cho việc kết nối các biểu thức luận lý. Giống như các toán tử quan hệ, các toán tử luận lý ước lượng tới 0 hoặc 1.
STT | Toán tử | Tên | Ví dụ | Kết quả |
---|---|---|---|---|
1 | ! | Phủ định | !5 | 0 |
2 | && | Phép và | 5 > 4 && 5 > 6 | 0 |
3 | || | Phép hoặc | 5 > 4 || 5 > 6 | 1 |
4.Toán tử tăng/giảm
Các toán tử tăng một (++) và giảm một (- -) cung cấp các tiện lợi tương ứng cho việc cộng thêm1 vào một biến số hay trừ đi 1 từ một biến số. Ví dụ với khai báo int i = 5, k;
Toán tử | Tên | Ví dụ | Kết quả k | Kết quả i |
---|---|---|---|---|
++ | Tăng 1 (tiền tố) | k = ++i | 6 | 6 |
++ | Tăng 1 (hậu tố) | k = i++ | 5 | 6 |
- - | Giảm 1 (tiền tố) | k = – -i | 4 | 4 |
- - | GIảm 1 (hậu tố) | k = i- - | 5 | 4 |
Tức là ta có:
++i thì i được tăng trước sau đó sẽ lấy kết quả để thực hiện biểu thức
i++ thì i được đưa vào thực hiện biểu thức trước sau đó mới tăng i lên 1
++i thì i được tăng trước sau đó sẽ lấy kết quả để thực hiện biểu thức
i++ thì i được đưa vào thực hiện biểu thức trước sau đó mới tăng i lên 1
5.Toán tử khởi tạo
Toán tử khởi tạo được sử dụng để lưu trữ một biến. Toán hạng trái nên là một giá trị trái và toán hạng phải có thể là một biểu thức bất kỳ. Biểu thức được tính và kết quả được lưu trữ trong vị trí được chỉ định bởi giá trị trái.
Toán tử | Ví dụ | Tương đương với |
---|---|---|
= | x = 5 | Gán 5 cho x |
+= | x += 5 | x = x + 5 |
-= | x -= 5 | x = x – 5 |
*= | x *= 5 | x = x * 5 |
/= | x /= 5 | x = x / 5 |
%= | x %= 5 | x = x % 5 |
Phép toán khởi tạo chính nó là một biểu thức mà giá trị của nó là giá trị được lưu trong toán hạng trái của nó. Vì thế một phép toán khởi tạo có thể được sử dụng như là toán hạng phải của một phép toán khởi tạo khác. Bất kỳ số lượng khởi tạo nào có thể được kết nối theo cách này để hình thành một biểu thức. Vídụ:
int m,n,p;
m = n = p = 100; // nghĩa là: n = (m = (p= 100));
m = (n = p = 100) + 2; // nghĩa là: m = (n = (p= 100)) + 2;
Việc này có thể ứng dụng tương tựcho các hình thức khởi tạo khác.
Ví dụ:
m = 100;
m += n = p = 10; // nghĩalà: m= m+ (n = p = 10);
int m,n,p;
m = n = p = 100; // nghĩa là: n = (m = (p= 100));
m = (n = p = 100) + 2; // nghĩa là: m = (n = (p= 100)) + 2;
Việc này có thể ứng dụng tương tựcho các hình thức khởi tạo khác.
Ví dụ:
m = 100;
m += n = p = 10; // nghĩalà: m= m+ (n = p = 10);
6.Toán tử điều kiện
Toán tử điều kiện yêu cầu 3 toán hạng. Hình thức chung của nó là:
toán hạng 1? toán hạng 2: toán hạng 3
Toán hạng đầu tiên được ước lượng và được xem như là một điều kiện. Nếu kết quả không là 0 thì toán hạng 2 được ước lượng và giá trịcủa nó là kết quả sau cùng. Ngược lại, toánhạng 3 được ước lượng và giá trị của nó là kết quả sau cùng. Ví dụ:
int m = 1, n = 2; int min = (m < n? m :n); // min nhận giá trị1
Chú ý rằng trong các toán hạng thứ 2 và toán hạng thứ 3 của toán tử điều kiện thì chỉcó một toán hạng được thực hiện. Điều này là quan trọng khi một hoặc cả hai chứa hiệu ứng phụ (nghĩa là, việc ước lượng của chúng làm chuyển đổi giá trịcủa biến). Ví dụ, với m = 1và n = 2 thì trong:
int min = (m < n ? m++ : n++);
m được tăng lên bởi vì m++ được ước lượng nhưng n không tăng vì n++ không được ước lượng. Bởi vì chính phép toán điều kiện cũng là một biểu thức nên nó có thể được sử dụng như một toán hạng của phép toán điều kiện khác, có nghĩa là các biểu thức điều kiện có thể được lồng nhau.
Ví dụ:
Ví dụ:
int m = 1, n = 2, p =3; int min = (m < n ? (m < p ? m: p) : (n < p ? n: p));
7.Toán tử phẩy
Nhiều biểu thức có thể được kết nối vào cùng một biểu thức sử dụng toán tử phẩy. Toán tử phẩy yêu cầu 2 toán hạng. Đầu tiên nó ước lượng toán hạng trái sau đó là toán hạng phải, và trả về giá trị của toán hạng phải như là kết quả sau cùng.
Ví dụ: int m, t;
m = (t =2, t5 + 10)
Khi đó t =2 và m = 25+10 = 20.
Ví dụ nữa để các bạn chạy và xem kêt quả.
Ví dụ: int m, t;
m = (t =2, t5 + 10)
Khi đó t =2 và m = 25+10 = 20.
Ví dụ nữa để các bạn chạy và xem kêt quả.
#include <stdio.h> int main(){ int a = 5, b = 7, c = 8, d = 11, min; min = (a < b ? (c++, a) : (d--, b)); printf("min = %d\nc = %d\nd = %d\n", min, c, d); return 0; }
Kết quả:
min = 5
c = 9
d = 11
8.Toán tử lấy kích thước
C cung cấp toán tử hữu dụng, sizeof, để tính toán kích thước của bất kỳ hạng mục dữ liệu hay kiểu dữ liệu nào. Nó yêu cầu một toán hạng duy nhất có thể là tên kiểu (ví dụ, int) hay một biểu thức (ví dụ, 100) và trả về kích thước của những thực thể đã chỉ định theo byte. Chạy thử ví dụ nhá.
#include <stdio.h> int main(){ printf("char size = %d byte\n", sizeof(char)); printf("short size = %d byte\n", sizeof(short)); printf("int size = %d byte\n", sizeof(int)); printf("long size = %d byte\n", sizeof(long)); printf("float size = %d byte\n", sizeof(float)); printf("double size = %d byte\n", sizeof(double)); printf("1.55 size = %d byte\n", sizeof(1.55)); printf("\"Hello\" size = %d byte\n", sizeof("Hello")); return 0; }
Kết quả:
char size = 1 byte
short size = 2 byte
int size = 4 byte
long size = 4 byte
float size = 4 byte
double size = 8 byte
1.55 size = 8 byte
“Hello” size = 6 byte
9.Độ ưu tiên của các toán tử
Thứ tự mà các toán tử được ước lượng trong một biểu thức là rất quan trọng và được xác định theo các luật ưu tiên. Các luật này chia các toán tử C ra thành một số mức độ ưu tiên. Các toán tử ởmức cao hơn sẽ có độ ưu tiên cao hơn các toán tử có độ ưu tiên thấp hơn.

No comments:
Post a Comment