Bạn đang đọc: Java Bài 5: Toán Tử (Operator) – YellowCode.Books
Được chỉnh sửa ngày 23/10/2020 .
Chào mừng những bạn đến với bài học kinh nghiệm Java số 5, bài học kinh nghiệm về những toán tử trong Java. Bài học này nằm trong chuỗi bài học kinh nghiệm lập trình ngôn từ Java của Yellow Code Books .
Nếu như ở bài trước các bạn đã làm quen với việc khai báo và sử dụng các biến và hằng trong Java. Thì đến bài hôm nay chúng ta cùng học cách vận dụng các biến và hằng này vào các logic tính toán trong chương trình, 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 các Toán Tử, mình muốn nói về khái niệm Biểu Thức cái đã.
Tóm Tắt
Biểu Thức
Bạn nên biết là lập trình không khác gì làm toán cả, tất cả chúng ta, những Lập Trình Viên, chỉ đơn giản là đang vận dụng các phép toán mà chúng ta đã từng được học vào trong việc lập trình ra các ứng dụng mà thôi. Và để làm quen lại với kiến thức toán, chúng ta cùng quay về với khái niệm Biểu Thức. Trong 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. Trong đó 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.
Mình xin minh họa một Biểu Thức như sau .
Hình minh họa một Biểu Thức
Qua đó * và + là các Toán Tử. 2, y và 5 là các Toán Hạng. Rõ hơn nữa thì 2 và 5 là các Hằng, còn y là Biến.
Cũng giống như trong toán học, 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 sẽ được ưu tiên thực hiện trước.
Ví dụ minh họa cho một Biểu Thức có dấu ngoặc đơn .
2 * (y + 5)
Toán Tử Số Học
Chúng ta làm quen với Toán Tử thứ đầu tiên trong lập trình, Toán Tử này thì hoàn toàn giống với toán học, đó là các phép toán cộng, trừ, nhân, chia. Các phép toán này được gom lại chung vào một Toán Tử, gọi là Toán Tử Số Học. Cụ thể về các Toán Tử Số Học được mình 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òn có thể cộng Chuỗi sẽ được mình nói cụ thể ở 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ố 1
Bạn hãy thử code để biết kết quả in ra của phép gán (toán tử Gán sẽ được nói rõ ở mục tiếp theo) từ một Biểu Thức tới biến age với các Toán Tử Số Học như sau.
int age; int thisYear = 2016; int yearOfBirth = 1990; age = thisYear - yearOfBirth; System.out.println("I am " + age + " years old");
Kết quả như sau
I am 26 years old
Bài Thực Hành Số 2
Bạn thử đoán xem kết quả in ra của các các so1, so2, 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é.
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à hiệu quả .
Ket qua so1 la 2, so2 la 3, so3 la 2.0
Toán Tử Gán
Giờ chúng ta cùng ra khỏi toán học để đến biểu thức có vẻ giống lập trình hơn xíu. Trong lập trình, ngoài các Toán Tử cộng, trừ, nhân chia như trong toán học ra, chúng ta còn có nhiều Toán Tử đặc thù khác, một trong những Toán Tử chúng ta làm quen đầu tiên hôm nay đó là 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à một phép gán. Phép gán được định nghĩa cụ thể thông qua cú pháp.
tên_biến = biểu_thức
Khi đó kết quả của một biểu_thức (biểu_thức này có thể là một Biểu Thức gồm nhiều Toán Tử và Toán Hạng, hay có thể chỉ là một con số như các ví dụ ở bài trước) sẽ được gán vào tên_biến. Tức là tên_biến sẽ chứa đựng giá trị bằng với biểu_thức mang đến thông qua phép gán này.
Bài Thực Hành Số 3
Với bài thực hành này, 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ến thisYear là gì nhé.
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ử code và thực thi bằng IDE, hoặc tự đoán tác dụng trước khi xem tác dụng bên dưới .
This year is 2016
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 được gán 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 .
int x = 10; int y = 10; int z = 10;
Thì bạn hoàn toàn có thể thực thi việc gán chỉ với một dòng như dưới đây. Đảm bảo đúng .
int x; int y; int z; x = y = z = 10;
Hoặc bạn hoàn toàn có thể viết ngắn gọn hơn, cách viết này gom những khai báo biến với cùng một kiểu tài liệu vào cùng một dòng .
int x, y, z; x = y = z = 10;
Nhưng lưu ý bạn không thể viết như vậy được: int x = int y = int z = 10;
.
Đầy Đủ Các Toán Tử Gán
Thực sự thì Toán Tử Gán không chỉ có mỗi toán tử “=”. Trong Java có rất nhiều các Toán Tử Gán nữa được mình liệt kê ở bảng dưới đây, bao gồm toán tử “=” đã nói trên kia.
Cú pháp thì cũng như toán tử “=” trên kia thôi, chỉ khác ở chỗ nó sẽ được thay thế bởi các toán tử cụ thể vào “=” như “+=”, “-=”,…
Toán Tử | Ý Nghĩa |
---|---|
= | Đã được mình nói rõ ở trên kia rồi nhé. |
+= | Cộng giá trị của tên_biến bên trái với biểu_thức bên phải và gán kết quả đó lại cho tên_biến. |
-= | Ngược lại với toán tử trên, toán tử này trừ giá trị của tên_biến bên trái một giá trị biểu_thức bên phải, rồi gán kết quả đó lại cho tên_biến. |
*= | Tương tự, nhân tên_biến với biểu_thức với và gán kết quả lại cho tên_biến. |
/= | Chia tên_biến cho biểu_thức và gán kết quả lại cho tên_biến. |
%= | Chia lấy phần dư tên_biến cho biểu_thức và gán kết quả lại cho tên_biến. |
<<= | Dịch trái tên_biến sang một giá trị biểu_thức và gán kết quả lại cho tên_biến. Bạn hãy xem Toán Tử Bitwise bên dưới để biết dịch trái nghĩa là gì nhé. |
>>= | Ngược lại. Dịch phải tên_biến sang một giá trị biểu_thức và gán kết quả lại cho tên_biến. Và bạn cũng xem Toán Tử Bitwise bên dưới để biết dịch phải nghĩa là gì nhé. |
&= | AND tên_biến với biểu_thức và gán kết quả lại cho tên_biến. Cũng xem Toán Tử Bitwise để rõ hơn về Toán Tử AND. |
|= | OR tên_biến với biểu_thức và gán kết quả lại cho tên_biến. Cũng xem Toán Tử Bitwise để rõ hơn về Toán Tử OR. |
^= | XOR tên_biến với biểu_thức và gán kết quả lại cho tên_biến. Cũng xem Toán Tử Bitwise để rõ hơn về Toán Tử XOR. |
Để hiểu rõ hơn về các Toán Tử Gán liệt kê trên đây mời bạn đến với bài thực hành sau.
Bài Thực Hành Số 4
Bạn thử đoán xem các so1, so2, so3, so4 sẽ có các giá trị như thế nào sau các phép gán sau nhé.
int so1, so2, so3, so4; so1 = so2 = so3 = so4 = 10; so1 += so2; so2 -= 5; so3 /= 2; so4 %= 3; System.out.println("Ket qua so1 la " + so1 + ", so2 la " + so2 + ", so3 la " + so3 + ", so4 la " + so4);
Và hiệu quả in ra là .
Ket qua so1 la 20, so2 la 5, so3 la 5, so4 la 1
Mình xin giải thích một chút cho các bạn dễ hiểu. Mình không nói lại việc khai báo và gán giá trị ban đầu là 10 cho các biến nữa. Chúng ta bắt đầu với đoạn code sau.
so1 += so2;
câu lệnh này sẽ lấy giá trị của so1 ban đầu là 10 cộng với so2 cũng là 10, kết quả của phép cộng là 20 sẽ được gán cho so1. Nếu bạn thấy khó hiểu, thì mình xin bật mí cách viết này là viết ngắn gọn của câu lệnh so1 = so1 + so2;
mà thôi.
Tương tự so2 -= 5;
là cách viết ngắn gọn của so2 = so2 - 5;
. Cách này lấy so2 trừ đi cho 5 rồi gán kết quả lại cho so2.
Và so3 /= 2;
cũng giống như so3 = so3 / 2;
.
so4 %= 3;
giống như so4 = so4 % 3;
.
Bạn hãy tự suy luận tương tự với các Toán Tử còn lại ở bảng trên kia nhé.
Toán Tử Một Ngôi
Một Toán Tử đặc trưng của lập trình nữa, đó là Toán Tử Một Ngôi. Với Toán Tử này, thì chỉ cần một Toán Tử kết hợp với một Toán Hạng thôi 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ố 5
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.
int soDuong = 4; int soGi = soDuong + -10; System.out.println("Ket qua la " + soGi);
Và hiệu quả như sau chắc bạn cũng thuận tiện đoán được .
Ket qua la -6
Bài Thực Hành Số 6
Bạn hãy chú ý vào các Toán Tử “++” và “- -“ sau đây, như đã nói, các Toán Tử này sẽ làm Toán Hạng đứng sau nó tăng lên hoặc giảm đi 1 rồi mới thực hiện các phép toán khác.
int so1 = 4; int so2 = 10; int soKetQua = ++so1 + --so2; System.out.println("So1 la " + so1 + ", so2 la " + so2 + ", ket qua la " + soKetQua);
Và hiệu quả là .
So1 la 5, so2 la 9, ket qua la 14
Mình xin giải thích một chút ở Bài Thực Hành Số 6 trên đây, vì Toán Tử Một Ngôi dạng này sẽ hơi lạ với các bạn mới làm quen với lập trình. Với việc 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 hai 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 những ý mình liệt kê trên đây, bạn hãy thử sửa code trên lại một chút ít như sau và chạy lại nhé .
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à .
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à so1 vẫ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 nhé.
Bài Thực Hành Số 7
Bạn thử ngẫm xem tác dụng in ra sẽ là giá trị true hay false nhé .
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ó hiệu quả của riêng mình chưa ? Nếu có rồi thì cùng so sánh với tác dụng bên dưới nhé .
Ket qua 1: false Ket qua 2: true Ket qua 3: true Ket qua 4: false
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 học sau. |
Sau đây là Bảng chân trị, tức các kết quả so sánh điều kiện của các Toán Tử && và || như sau.
p | q | p && q | p || q |
---|---|---|---|
false | false | false | false |
false | true | false | true |
true | false | false | true |
true | true | true | true |
Bài Thực Hành Số 8
Bạn thử gõ những câu lệnh sau và ngẫm tác dụng của nó nhé .
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 .
true false true true
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à false. false && false kết quả theo bảng chân trị là false.
Bạn cứ giải nghĩa tựa như cho những 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. Để hiểu về việc làm việc với các bit là gì thì dài dòng lắm, có thể mình sẽ nói rõ hơn ở các bài khác. Nhưng bạn có thể hiểu là bản chất của tất cả dữ liệu mà máy tính có thể hiểu và làm việc chính là các dữ liệu dạng nhị phân được biểu diễn chỉ bởi hai giá trị là 0 và 1. Mỗi một giá trị 0 hay 1 như vậy là một bit, do đó có thể nói Toán Tử Bitwise là Toán Tử tương tác trực tiếp đến các bit là vậy.
Lưu ý là Toán Tử Bitwise này sẽ không thao tác được với những tài liệu thuộc kiểu số thực ( float và double ) .
Bảng sau là 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 thực tế Toán Tử Bitwise, bạn hãy xem qua Bảng chân trị cho Bitwise như sau .
p | q | p & q | p | q | p ^ q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
Bài Thực Hành Số 9
Ở bài thực hành thực tế này tất cả chúng ta cùng code thử những Toán Tử Bitwise như sau, mình sẽ lý giải tác dụng tại sao ở bên dưới bài thực hành thực tế này .
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 .
Toan tu &: 4 Toan tu |: 13 Toan tu ^: 9 Toan tu ~: 1 Toan tu <<: 10 Toan tu >>: 3
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 ^ so2: 0000 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.
Chúng ta vừa mới đi qua bài học kinh nghiệm về những Toán Tử trong Java, qua bài học kinh nghiệm ngày hôm nay bạn đã hiểu rõ hơn ngôn từ Java hơn rồi đúng không nào. Các Toán Tử ngày hôm nay sẽ được ứng dụng khá nhiều vào những kỹ năng và kiến thức và bài thực hành thực tế sau này. Bạn hãy cố gắng nỗ lực theo dõi những bài học kinh nghiệm mê hoặc phía trước nhé .
Cảm ơn bạn đã đọc các bài viết của Yellow Code Books. Bạn hãy ủng hộ blog bằng cách:
– Đánh giá 5 sao ở mỗi bài viết nếu thấy thích.
– Comment bên dưới mỗi bài viết nếu có thắc mắc.
– Để lại địa chỉ email của bạn ở thanh bên phải để nhận được thông báo sớm nhất khi có bài viết mới.
– Chia sẻ các bài viết của Yellow Code Books đến nhiều người khác.
– Ủng hộ blog theo hướng dẫn ở thanh bên phải để blog ngày càng phát triển hơn.
Bài Kế Tiếp
Bạn sẽ cùng nhau xem qua phương pháp ép kiểu, và cách ghi chú vào source code nhé .
Source: https://final-blade.com
Category: Kiến thức Internet