Các toán tử và biểu thức trong C
- 06-01-2023
- Toanngo92
- 0 Comments
Chúng ta hãy lấy ví dụ tương tự mà chúng ta đã giải quyết trong phần trước để cộng hai số và hiển thị tổng của chúng. Mã giả cho cùng được đưa ra trong ví dụ như sau:
BEGIN
INPUT A
INPUT B
C = A+B
DISPLAY C
Trong ví dụ này, giá trị của hai biến a và 2 được chấp nhận. Các giá trị được thêm vào và tổng được lưu trữ trong câu lệnh C = A + B. Trong câu lệnh này, A và B là các biến, gọi là toán hạng và ký hiệu + được gọi là toán tử, A+B được gọi là biểu thức.
Mục lục
Biểu thức (Expression)
Một biểu thức có thể là bất kỳ tổ hợp nào của các toán tử và toán hạng. Toán tử thực hiện các phép toán như cộng, trừ, so sánh, v.v. Toán hạng là các biến hoặc giá trị mà các phép toán được thực hiện trên đó. Ví dụ: C = A + B thì B, C là toán hạng và + là toán tử. Các toán hạng và toán tử kết hợp cùng nhau thành một biểu thức.
Trong quá trình thực hiện chương trình, giá trị của biến (nếu có) được sử dụng cùng với các hằng số có trong biểu thức. Đánh giá diễn ra với sự giúp đỡ của các tooán tử. Do đó, mọi biểu thức C đều có giá trị.
Sau đây là ví dụ về các biểu thức:
2
x
2 + 5
2 + y + 10
2 + 6 * (4-2)
z + 3 * (8-z)
Toán tử
Toán tử là các kí hiệu mà chỉ cho chương trình dịch biết rằng nó cần thực hiện thao tác toán học hay logic nào. Trong ngôn ngữ C, toán tử được chia thành các danh mục sau:
- Toán tử số học
- Toán tử quan hệ
- Toán tử logic
- Toán tử gán
- Toán tử nhị phân
Để hiểu rõ hơn, chúng ta sẽ bắt đầu tìm hiểu từng loại toán tử
Toán tử số học (arimethic operators)
Các toán tử số học được sử dụng để thực hiện các phép toán số. Chúng được chia thành hai lớp: toán tử số học một ngôi và nhị phân.
Liệt kê các toán tử số học và mô tả:
Toán tử một ngôi | Mô tả | Toán tử hai ngôi | Mô tả |
– | Phép trừ một ngôi | + | Phép cộng |
++ | Tăng (1 đơn vị) | – | Phép trừ |
— | Giảm (1 đơn vị) | * | Phép nhân |
% | Phép chia lấy dư | ||
/ | Phép chia | ||
^ | Phép mũ |
Toán tử số học hai ngôi
Trong C, các toán tử hai ngôi hoạt động giống toán học và cũng tương tự như trong các ngôn ngữ khác. Các toán tử +, –, * và / có thể được áp dụng cho hầu hết mọi kiểu dữ liệu dựng sẵn được C cho phép (int, float, double). Có vài sự khác biệt nhỏ ví dụ:
- khi phép chia “/” được áp dụng cho một số nguyên hoặc ký tự, các số sau dấu . thập phân còn lại sẽ bị cắt bớt. Ví dụ, 7/2 sẽ bằng 3 trong phép chia số nguyên.
- Toán tử chia lấy dư (%) đưa ra kết quả là phần dư của phép chia số nguyên. Ví dụ: 5%2 sẽ trả kết quả bằng 1
Chúng ta hãy xem xét một ví dụ cho toán tử lũy thừa: 3^2. Ở đây, 3 là cơ số và 2 là số mũ. Kết quả 9^2 = 81.
Lưu ý: Các ngôn ngữ lập trình cơ bản, hỗ trợ toán tử ^ để thực hiện phép lũy thừa. Tuy nhiên, nhiều compiler C không hỗ trợ ký hiệu ^ cho lũy thừa. Một cách khác để tính lũy thừa trong C là sử dụng hàm pow) được định nghĩa trong. Cú pháp để tính lũy thừa giống như sau:
#include <stdio.h>
int main(){
int x,y,z;
x = 5;
y = 2;
/* the following function will calculate x to the power y */
z = pow (x,y);
printf("%d",z);
return 0;
}
// ket qua tra ra 25
Toán tử số học một ngôi
Các toán tử số học một ngôi là toán tử trừ (-), toán tử tăng 1 đơn vị (++) và toán tử giảm 1 đơn vị (–)
Ví dụ:
#include <stdio.h>
int main(){
int a = 5 , b = 6, c = 7;
printf("%d\n",a++); // pre-increment
printf("%d\n",++a); // post-increment
printf("%d\n",-b);
printf("%d\n",a--); // pre-decrement
printf("%d\n",--a); // post-decrement
// ket qua
// 5
// 7
// -6
// 7
// 5
return 0;
}
Toán tử gán (assignment operators)
Đây là toán tử phổ biến nhất trong bất kỳ ngôn ngữ nào và được mọi người biết đến. Trong C, toán tử gán có thể được sử dụng với bất kỳ biểu thức C hợp lệ nào. Cú pháp của toán tử gán là:
variable_name = expression;
Ngooài ra, chúng ta có thể sử dụng phép gán Multiple Assignment để gán nhanh:
#include <stdio.h>
int main(){
int a,b,c;
a = b = c = 5;
return 0;
}
Tuy nhiên nó không thể được thực hiện tại thời điểm khai báo của các biến. Ví dụ:
#include <stdio.h>
int main(){
int a = int b= int c= 0;
// error
}
Toán tử quan hệ (Relational Operators)
Các toán tử quan hệ được sử dụng để kiểm tra mối quan hệ giữa hai biến, hoặc giữa một biến và một hằng số. Ví dụ: kiểm tra số lớn hơn trong hai số a và b được thực hiện bằng dấu lớn hơn (>) giữa hai toán hạng a và b (a > b). Kết quả trả về giá trị true và false (đúng và sai).
Trong C true là bất kỳ giá trị nào khác 0 và false là 0. Biểu thức sử dụng toán tử quan hệ, trả về 0 cho false và 1 cho đúng. Ví dụ, xét biểu thức sau:
a == 14;
Biểu thức này kiểm tra sự bằng nhau, theo nghĩa là nó kiểm tra xem giá trị chứa trong biến a có bằng 14 hay không. Giá trị của biểu thức này trẻ về là 0 (false) nếu a có giá trị khác 14 và 1 (true) nếu nó là 14.
Ví dụ:
#include <stdio.h>
int main(){
int a = 6,b = 10;
printf("%d\n",5==6);
printf("%d\n",a == 6);
printf("%d\n",b != 6);
printf("%d\n",a == b);
// ket qua
//0
//1
//1
//0
return 0;
}
Liệt kê các toán tử quan hệ và mô tả:
Toán tử | Mô tả |
> | lớn hơn |
>= | lớn hơn hoặc bằng |
< | nhỏ hơn |
<= | nhỏ hơn hoặc bằng |
== | bằng nhau |
!= | không bằng |
Toán tử luận lý/logic (Logical Operators)
Các toán tử logic là các ký hiệu được dùng để kết hợp hoặc phủ định các biểu thức có chứa các toán tử quan hệ.
Biểu thức sử dụng toán tử logic trả về 0 cho false và 1 cho true
Liệt kê các toán tử logic và mô tả:
Toán tử | Mô tả |
&& | AND (và) |
|| | OR (hoặc) |
! | NOT (phủ định) |
Ví dụ:
#include <stdio.h>
int main(){
int a = 6,b = 10;
printf("%d\n",a== 5 && b == 10);
printf("%d\n",a== 5 || b == 10);
printf("%d\n", !(a == 6));
// ket qua
//0
//1
//0
return 0;
}
Toán tử logic nhị phân (Logic Bitwise operators)
Xét ví dụ một toán hạng 12 Toán tử bitwise sẽ coi số 12 này là 1100. Toán tử bitwise coi toán hạng là bit thay vì giá trị số. Các giá trị số có thể là bất kỳ cơ số nào: thập phân, bát phân hoặc thập lục phân. Toán tử Bitwise sẽ chuyển đổi toán hạng thành biểu diễn nhị phân của nó và theo đó trả về 1 hoặc 0.
Liệt kê các toán tử bitwise và mô tả:
Toán tử | Mô tả |
Bitwise AND x&y | Mỗi vị trí bit trả về 1 nếu bit của cả hai toán hạng là 1. |
Bitwise OR x|y | Mỗi vị trí bit trả về 1 nếu bit của một trong hai toán hạng là 1. |
Bitwise NOT (~x) | Đảo ngược các bit của toán hạng |
Bitwise XOR (x^y) | Mỗi vị trí bit trả về 1 nếu một trong hai bit của toán hạng là 1 nhưng trả về 0 nếu bit của 2 toán hạng đều là 1 |
Ví dụ:
Biểu thức 10 & 15 (1010 & 1111) trả về giá trị 1010 có nghĩa là 10.
Biểu thức 10 | 15 (1010 | 1111) trả về giá trị 1111 có nghĩa là 15.
Biểu thức 10 ^ 15 (1010 ^ 1111) trả về giá trị 0101 có nghĩa là 5.
Biểu thức ~10 ngụ ý (~1010 ) trả về giá trị -11.
Biểu thức Mixed Mode & Chuyển đổi kiểu dữ liệu
Biểu thức mixed mode là biểu thức trong đó các toán hạng của toán tử thuộc về các kiểu dữ liệu khác nhau.
Các toán hạng này thường được chuyển đổi thành cùng loại. Tất cả các toán hạng được chuyển đổi thành kiểu dữ liệu của toán hạng lớn nhất. Thường gọi là type conversion. Thứ tự của các loại dữ liệu khác nhau là:
char(1byte) < int(2bytes) < long(4bytes) < float(4bytes) < double(8bytes)
Ép kiểu (Cast)
Thông thường, một cách thực hành tốt là thay đổi tất cả các hằng int thành float nếu biểu thức làm các phép toán số học với số thực; nếu không thì một số biểu thức có thể mất đi giá trị thực của chúng. Ví dụ:
#include <stdio.h>
int main(){
int a = 2, b = 10;
printf("%d\n",a/b);
printf("%f\n",(float)a/b);
// ket qua
//0
//0.200000
return 0;
}
Cú pháp:
(data_type)expression
Thứ tự ưu tiên của các toán tử trong biểu thức
Thứ tự ưu tiên (precedence) thiết lập tuần tự thực thi của một nhóm toán tử này so với nhóm toán tử khác khi một biểu thức số học đưược tính toán Tóm lại, nó đề cập đến thứ tự mà C đánh giá các toán tử.
Thứ tự ưu tiên toán tử số học
Liệt kê các thứ tự ưu tiên toán tử và mô tả:
Lớp toán tử | Toán tử | Chiều đánh giá |
Một ngôi | – ++ — | phải sang trái |
Hai ngôi | ^ | trái sang phải |
Hai ngôi | * / % | trái sang phải |
Hai ngôi | + – | trái sang phải |
Hai ngôi | = | phải sang trái |
Thứ tự ưu tiên của các toán tử này có thể được ghi đè bằng cách đặt phần bắt buộc của biểu thức trong dấu ngoặc đơn (). Một biểu thức trong dấu ngoặc đơn luôn được đánh giá đầu tiên. Một bộ dấu ngoặc đơn có thể được đặt trong một dấu ngoặc đơn khác. Điều này được gọi là lồng các dấu ngoặc đơn. Trong trường hợp như vậy, việc đánh giá được thực hiện bằng cách mở rộng các dấu ngoặc đơn trong cùng trước và sau đó làm việc với cặp dấu ngoặc đơn lần lượt ra ngoài.
Nếu có một số bộ dấu ngoặc đơn trong một biểu thức thì việc đánh giá diễn ra từ trái sang phải.
Thứ tự ưu tiên toán tử so sánh
Một số toán tử số học, như chúng ta đã thấy trong phần trước, có một số loại ưu tiên hơn những toán tử khác. Không có ưu tiên như vậy giữa các toán tử so sánh. Do đó, chúng luôn được đánh giá từ trái sang phải.
Thứ tự ưu tiên toán tử logic
Liệt kê các thứ tự ưu tiên toán tử và mô tả:
Thứ tự ưu tiên | Toán tử |
1 | NOT |
2 | AND |
3 | OR |
Ví dụ, xét biểu thức sau:
(5==6) || (10==10) && !(10==9) && (1==1)
False OR True AND NOT False AND True
False OR True AND TRUE AND True
Fasle OR TRUE AND TRUE
Fasle OR TRUE
TRUE
Thứ tự ưu tiên giữa các loại toán tử
Thứ tự ưu tiên | Toán tử |
1 | Số học |
2 | So sánh (quan hệ) |
3 | Logic |
Bài tập
1. Viết chương trình nhập vào và tính trung bình cộng ba số: 4,5,7, mỗi số và kết quả cần có biến riêng lưu trữ
2. Viết chương trình khai báo một biến số thực giá trị bất kỳ. Con số này đại diện cho centimet. In ra số feet tương đương với feet và inch
‘Giả sử 2,54 cm trên inch và 12 inch trên foot
Nếu giá trị đầu vào là 333,3, định dạng đầu ra phải là:
333,3 cm là 10,9 feet
393,33 cm là 131,2 inch
3. Viết chương trình tính diện tích và chu vi hình chữ nhật.
4. Viết chương trình tính lương ròng của một nhân viên với các ràng buộc sau:
Lương cơ bản: $12000
DA: 12% Lương cơ bản
Nhân sự: $150
TA:$120
Khác : $450
Trừ thuế:
a) PF 14% lương cơ bản
b) IT: 15% lương cơ bản
Lương thực nhận = Lương cơ bản + DA+ HRA+ TA + Khác — (PF + IT)
6. Viết mã giả (PSUEDO) và lc đồ giải thuật giải quyết bài toán sau:
Yêu cầu nhập liệu điểm SV và hạnh kiểm
Nếu điểm SV >8 và < 10 , hạnh kiểm TOT in xếp hạng học sinh SX
Nếu điểm SV >8 và < 10 , hạnh kiểm KHA in xếp hạng học sinh GIOI
Nếu điểm SV >8 và < 10 , hạnh kiểm TB in xếp hạng học sinh KHA
Nếu điểm SV >6 và <= 8 , hạnh kiểm TOT in xếp hạng học sinh KHA
Nếu điểm SV >6 và <= 8 , hạnh kiểm KHA in xếp hạng học sinh KHA
Nếu điểm SV >6 và <= 8 , hạnh kiểm TB in xếp hạng học sinh TB
Nếu điểm SV > 0 và <= 6 , hạnh kiểm TOT in xếp hạng học sinh TB
Nếu điểm SV > 0 và <= 6 , hạnh kiểm KHA in xếp hạng học sinh TB
Nếu điểm SV > 0 và <= 6 , hạnh kiểm TB in xếp hạng học sinh YEU
Nếu điểm < 0 hoặc > 10, bất kể tình huống hạnh kiểm là gì in ra nhap khong hop le