Bài 5: Các Toán Tử (Operators)




Chào tất cả các bạn, bài trước chúng ta đã làm quen với việc khai báo biến và hằng trong Java. Bài này chúng ta học cách tương tác giữa các biến và hằng này, thông qua việc tìm hiểu về các Toán Tử.
Trước khi vào làm quen với từng Toán Tử, chúng ta hãy nói về khái niệm Biểu Thức.

Biểu Thức

Lập trình cũng không khác gì làm toán, chúng ta chỉ đơn giản đang vận dụng các phép toán mà chúng ta đã biết vào trong lập trình mà thôi. Đầu tiên là khái niệm Biểu Thứctrong toán học định nghĩa rằng Biểu Thức là sự kết hợp giữa các Toán Tử (Operator) và các Toán Hạng (Operand) theo đúng một trật tự nhất định. Mỗi Toán Hạng có thể là một hằng, một biến hoặc một Biểu Thức khác.
Ví dụ cho một Biểu Thức như sau.
Group 3.png
Trong đó * và + là các Toán Tử2 và 5 là các hằng, và y là biến.
Cũng giống như trong toán học, trong trường hợp Biểu Thức có nhiều Toán Tử thì bạn có thể dùng cặp dấu ngoặc đơn () để gom nhóm các Biểu Thức lại, và khi đó thì Biểu Thức trong dấu ngoặc đơn này sẽ được ưu tiên thực hiện trước.
Ví dụ cho Biểu Thức có dấu ngoặc đơn.

2 * (y + 5)

Toán Tử Gán

Trong Java, Toán Tử Gán được thực hiện thông qua ký hiệu “=”. Quen lắm phải không nào, vì bài trước bạn đã thực hành khai báo một biến như sau int count = 5; thì dấu “=” ở đây chính là bạn đang khai báo một phép gán. Phép gán được định nghĩa cụ thể qua công thức sau.

<tên biến> = <biểu thức>

Khi đó kết quả của một Biểu Thức bên phải (hay chỉ là một giá trị như các ví dụ ở bài trước) sẽ được gánvào biến bên trái, tức là biến bên trái sẽ chứa đựng giá trị bằng với Biểu Thức bên phải mang đến thông qua phép gán này.

Bài Thực Hành Số 1

Bạn hãy thực hiện phép gán sau đây và cho biết kết quả in ra log sau khi gán giá trị cho biếnthisYear là gì nhé.
1
2
3
4
5
final int THIS_YEAR = 2016;
int thisYear = 2000;
thisYear = THIS_YEAR;
System.out.println("This year is " + thisYear);
Kết quả như sau, bạn nên thử chạy bằng Eclipse, hoặc tự đoán kết quả trước khi click vào bên dưới.

Gán Cho Nhiều Biến Cùng Lúc

Trong trường hợp bạn có một giá trị giống nhau cho nhiều biến khác nhau, thay vì như ví dụ dưới đây bạn phải gán giá trị đó cho từng biến một.
1
2
3
int x = 10;
int y = 10;
int z = 10;
Thì bạn có thể thực hiện việc gán chỉ với một dòng như dưới đây. Đảm bảo đúng.
Đúng
int x;
int y;
int z;
x = y = z = 10;
Hoặc bạn có thể viết ngắn gọn hơn.
Đúng
int x, y, z;
x = y = z = 10;
Nhưng lưu ý bạn không thể viết như vậy được.
Sai
int x = int y = int z = 10;

Toán Tử Số Học

Trong lập trình Java cũng như trong toán học, chúng ta có các phép toán cộng, trừ, nhân, chia, đó là cácToán Tử Số Học. Cụ thể về các Toán Tử Số Học được liệt kê ở bảng sau.
Toán TửÝ Nghĩa
+Toán Tử Cộng, có thể cộng các số, và cộng chuỗi sẽ được nói ở bài học chuỗi sau.
Toán Tử Trừ.
*Toán Tử Nhân.
/Toán Tử Chia lấy phần nguyên, ví dụ 5/2 sẽ bằng 2, phần dư bị loại bỏ.
%Toán Tử Chia lấy phần dư, ví dụ 5%2 sẽ bằng 1, đó chính là số dư của phép chia.

Bài Thực Hành Số 2

Bạn hãy thử code để biết kết quả in ra của phép gán từ Biểu Thức với các Toán Tử số học như sau.
1
2
3
4
5
int age;
int thisYear = 2016;
int yearOfBirth = 1990;
age = thisYear - yearOfBirth;
System.out.println("I am " + age + " years old");
Bạn có thể xem kết quả bằng cách click vào mục dưới đây.

Bài Thực Hành Số 3

Bạn thử đoán xem kết quả in ra của các các so1so2, và so3 như ví dụ bên dưới, và xem kết quả có đúng với bạn đoán không nhé.
1
2
3
4
5
6
7
8
9
int so1;
int so2;
float so3;
so1 = 15 / 6;
so2 = 15 % 6;
so3 = 15 / 6;
System.out.println("Ket qua so1 la " + so1 + ", so2 la " + so2 + ", so3 la " + so3);
Và kết quả.

Toán Tử Một Ngôi

Với Toán Tử Một Ngôi, chỉ cần một Toán Tử kết hợp với một Toán Hạng là đã có thể cho ra kết quả. Các bạn hãy nhìn vào bảng sau.
Toán TửÝ Nghĩa
+Toán Tử Cộng, toán tử cộng này khác với toán tử cộng ở bảng Số Học trên, toán tử này biểu diễn số dương. Vì các số dương bình thường không cần phải hiển thị toán tử này, nên bạn cũng sẽ không thấy công dụng của nó.
Toán Tử Trừ, ngược lại với toán tử cộng ở trên, toán tử trừ này biểu diễn số âm.
++Toán Tử Tăng, toán tử này sẽ làm tăng giá trị của toán hạng lên 1 đơn vị.
– –Toán Tử Giảm, toán tử này sẽ làm giảm giá trị của toán hạng đi 1 đơn vị.
!Toán Tử Phủ định logic. Toán tử này sẽ đảo ngược giá trị của biến biểu thức logic. Nếu biểu thức logic đang là true thì sẽ bị đảo ngược thành false và ngược lại

Bài Thực Hành Số 4

Bạn hãy nhìn biểu thức dưới đây, soGi sẽ được gán bằng một Biểu Thức, mà ở đó soDuongđược cộng với một Toán Tử Một Ngôi biểu thị số âm.
1
2
3
int soDuong = 4;
int soGi = soDuong + -10;
System.out.println("Ket qua la " + soGi);
Và kết quả như sau chắc bạn cũng dễ dàng đoán được.

Bài Thực Hành Số 5

Bạn hãy chú ý vào các Toán Tử “++” và “- -“ sau đây, các Toán Tử này sẽ làm Toán Hạng đứng sau nó tăng lên và giảm đi 1 rồi mới thực hiện các phép toán khác.
1
2
3
4
int so1 = 4;
int so2 = 10;
int soKetQua = ++so1 + --so2;
System.out.println("So1 la " + so1 + ", so2 la " + so2 + ", ket qua la " + soKetQua);
Và kết quả là.

Với Bài Thực Hành Số 5 ở trên đây, thì khi thực hiện Biểu Thức soKetQua = ++so1 + – -so2; hệ thống sẽ thực hiện biểu thức ++so1 trước và so1 sau đó mang giá trị là 5 (++so1 lúc bấy giờ tương tự như biểu thức so1 = so1 + 1; vậy), rồi hệ thống cũng thực hiện tiếp – -so2 ra giá trị 9 (tương tự thì – -so2 cũng sẽ giống như so2 = so2 – 1;), sau cùng thì tiến hành cộng 2 số này lại và gán cho biến soKetQua.
Có bạn nào thắc mắc là hai cách viết ++so1 và so1++ có khác nhau không? Câu trả lời là Có. Cũng giống như C/C++, khi bạn viết ++so1, Java sẽ thực hiện việc tăng giá trị của so1 trước khi lấy giá trị đó dùng vào trong Biểu Thức. Còn nếu viết so1++, Java sẽ lấy giá trị của so1 dùng vào trong Biểu Thức trước khi tăng giá trị của nó.
Để hiểu rõ hơn bạn thử sửa code trên lại một chút như sau và chạy lại.
1
2
3
4
int so1 = 4;
int so2 = 10;
int soKetQua = so1++ + so2;
System.out.println("So1 la " + so1 + ", so2 la " + so2 + ", ket qua la " + soKetQua);
Kết quả in ra là.
1
So1 la 5, so2 la 10, ket qua la 14
Với thử nghiệm trên, bạn thấy so1++ không hề được áp dụng tăng giá trị của so1 vào biểu thức, mà so1vẫn mang giá trị 4 rồi cộng với so2 là 10 ra kết quả 14. Sau khi thự hiện xong Biểu Thức thì so1 mới được tăng giá trị và vì vậy bạn thấy in ra so1 là 5.

Toán Tử Quan Hệ

Toán Tử Quan Hệ sẽ so sánh các Biểu Thức với nhau để cho ra một giá trị boolean, tức là cho ra một trong hai giá trị là true hay false. Bạn hãy nhìn vào bảng để xem các Toán Tử Quan Hệ sau.
Toán TửÝ Nghĩa
==Bằng
!=Không bằng (khác)
>Lớn hơn
>=Lớn hơn hoặc bằng
<Nhỏ hơn
<=Nhỏ hơn hoặc bằng
Chú ý rằng kết quả của Toán Tử này luôn trả về một giá trị boolean.

Bài Thực Hành Số 6

Bạn thử ngẫm xem kết quả in ra sẽ là giá trị true hay false nhé.
1
2
3
4
5
6
7
8
9
10
double weight = 71.23;
int height = 191;
boolean married = false;
boolean attached = false;
char gender = 'm';
System.out.println("Ket qua 1: " + (!married == attached));
System.out.println("Ket qua 2: " + (gender != 'f'));
System.out.println("Ket qua 3: " + (height >= 180));
System.out.println("Ket qua 4: " + (weight > 90));
Bạn đã có kết quả của riêng mình chưa? Nếu có rồi thì click vào kết quả bên dưới để so sánh nhé.

Toán Tử Điều Kiện

Các Toán Tử Điều Kiện sẽ so sánh các Biểu Thức mang giá trị true và false với nhau. Toán Tử này còn được gọi là Toán Tử Logic. Bạn cứ tưởng tượng toán tử này sẽ hoạt động theo kiểu câu nói “nếu trời không mưa và tôi có tiền thì tôi sẽ đi chơi hôm nay”, trong đó ” nếu trời không mưa” mang một giá trị boolean“tôi có tiền” cũng là một giá trị boolean, hai giá trị này được so sánh bởi Toán Tử “và”. Vậy nếu “trời không mưa”và “tôi có tiền” đều mang giá trị true thì kết quả so sánh sẽ là true, tức “tôi sẽ đi chơi hôm nay” là true, tức là tôi sẽ đi chơi. Ngược lại nếu một trong hai vế đầu là false thì kết quả sẽ là false, tức tôi sẽ không đi chơi. Các Toán Tử Điều Kiện được nêu trong bảng sau.
Toán TửÝ Nghĩa
&&So sánh AND.
||So sánh OR.
?:So sánh theo điều kiện, sẽ được nhắc đến khi chúng ta học đến cách viết điều kiện if..else.. ở bài sau.
Bảng chân trị, tức các kết quả so sánh điều kiện của Toán Tử && và || như sau.
pqp && qp || q
falsefalsefalsefalse
falsetruefalsetrue
truefalsefalsetrue
truetruetruetrue

Bài Thực Hành Số 7

Bạn thử gõ các câu lệnh sau và ngẫm kết quả của nó nhé.
1
2
3
4
5
6
7
8
9
10
11
int age = 18;
double weight = 71.23;
int height = 191;
boolean married = false;
boolean attached = false;
char gender = 'm';
System.out.println(!married && !attached && (gender == 'm'));
System.out.println(married && (gender == 'f'));
System.out.println((height >= 180) && (weight >= 65) && (weight <= 80));
System.out.println((height >= 180) || (weight >= 90));
Kết quả như sau.
Chúng ta thử giải nghĩa dòng in log thứ nhất để hiểu rõ hơn. Đầu tiên biến married có giá trị false!marriedđảo ngược giá trị thành true. Tương tự attched là false và !attached là true(gender == ‘m’) sẽ là true. Tóm lại chúng ta có true && true && true, và kết quả cuối cùng theo bảng chân trị là true.
Dòng thứ hai, ưu tiên biểu thức trong ngoặc đơn trước (gender == ‘f’) sẽ cho kết quả false. Biến marriedđược khai báo là falsefalse && false kết quả theo bảng chân trị là false.
Bạn giải nghĩa tương tự cho các dòng còn lại.

Toán Tử Bitwise

Toán Tử Bitwise là Toán Tử sẽ tương tác trực tiếp đến các bit của Toán Hạng. Lưu ý là Toán Tử Bitwise sẽ không làm việc được với các dữ liệu thuộc kiểu số thực (float và double).
Bảng sau sẽ mô tả các Toán Tử Bitwise.
Toán TửÝ Nghĩa
&AND
|OR
^XOR
~NOT, đảo ngược bit 0 thành 1, và ngược lại 1 thành 0.
>>Dịch phải
<<Dịch trái
Bạn nên nhớ AND ở Toán Tử Bitwise chỉ có một dấu &, còn AND ở Toán Tử Điều Kiện có hai dấu &&. Và một điều khác nhau nữa là && chỉ so sánh các Biểu Thức boolean với nhau, còn & so sánh dựa trên các bit, và vì vậy & có thể làm việc với mọi kiểu dữ liệu nguyên thủy trong Java trừ kiểu số thực đã nói ở trên. Tương tự cho khác nhau giữa || và |.
Vậy trước khi đi vào bài thực hành Toán Tử Bitwise, bạn hãy xem qua bảng chân trị cho Bitwise như sau.
pqp & qp | qp ^ q
00000
01011
10011
11110

Bài Thực Hành Số 8

Ở bài thực hành này chúng ta cùng code thử các Toán Tử Bitwise như sau, chúng ta sẽ cùng nhau giải thích kết quả tại sao ở bên dưới bài thực hành này.
1
2
3
4
5
6
7
8
9
byte so1 = 5;
byte so2 = 12;
System.out.println("Toan tu &: " + (so1 & so2));
System.out.println("Toan tu |: " + (so1 | so2));
System.out.println("Toan tu ^: " + (so1 ^ so2));
System.out.println("Toan tu ~: " + (so1 & ~so2));
System.out.println("Toan tu <<: " + (so1<<1));
System.out.println("Toan tu >>: " + (so2>>2));
Kết quả ở dưới đây.

Giờ hãy cùng nhau giải thích ý nghĩa của các phép toán. Chúng ta đều biết kiểu dữ liệu byte được hệ thống cấp phát cho 1 byte bộ nhớ, và 1 byte = 8 bits, vậy hai biến so1 và so2 có giá trị lần lượt là 5 và 12 sẽ được biểu diễn dạng bit như sau.
5   = 0000 0101
12 = 0000 1100
so1 & so2: nếu bạn lấy 0000 0101 & 0000 1100, bạn hãy áp dụng bảng chân trị vào so sánh từng bit với nhau, bạn sẽ có kết quả là 0000 0100, đây là biểu diễn bit của số 4, và là kết quả của dòng log đầu tiên.
so1 | so2: tương tự như trên 0000 0101 | 0000 1100 sẽ là 0000 1101, là dạng bit của số 13.
so1 ^ so20000 0101 ^ 0000 1100 sẽ là 0000 1001, là dạng bit của số 9.
so1 & ~so2: ta xét từ ~so2~ là toán tử NOT, nó sẽ đảo ngược các bit của so2 thành 1111 0011, vậy so1 & ~so2 sẽ là 0000 0101 & 1111 0011, sẽ là 0000 0001, là dạng bit của số 1.
so1<<1: tức là lấy dãy bit của so1 dịch trái đi 1 bit, sẽ thành 0000 1010, là dạng bit của số 10.
so2>>2: tức là lấy dãy bit của so2 dịch phải đi 2 bit, sẽ thành 0000 0011, là dạng bit của số 3.
Bạn đã cùng tôi đi qua bài học về các Toán Tử trong Java, bạn đã hiểu rõ ngôn ngữ Java hơn rồi đúng không nào. Hãy cố gắng thực hành và chúng ta sẽ cùng trải qua các bài học thú vị phía trước nữa nhé.

Bài Kế Tiếp

Bạn sẽ cùng nhau xem qua cách thức ép kiểu, cách ghi chú vào source code, và xem qua cách thức nhập/xuất dữ liệu vào chương trình nữa nhé.
Java Bài 6: Ép Kiểu & Comment Source Code →


                                                                                                     Nguồn : yellowcodebooks.com


Đăng nhận xét

Cảm Ơn Bạn Đã Để Lại Bình Luận

 

Quản Trị Viên

Lượt xem

Lên Trên