Các toán tử thường dùng trong Java

Trong bài ngày hôm nay, tôi sẽ giới thiệu đến các bạn các toán tử cơ bản (Basic Operators) trong Java. Sau đó, tôi sẽ đưa ra một ví dụ tổng hợp những gì chúng ta học từ đầu series tới giờ và có sử dụng các loại toán tử này. Trong phần bài tập, tôi cũng sẽ đưa ra một số dạng bài tập cho các bạn tham khảo.

1. Các toán tử cơ bản (Basic Operators) trong Java.

Trong Java, chúng ta thường gặp các loại toán tử sau: Toán tử gán, toán tử số học, toán tử một ngôi, toán tử so sánh, toán tử luận lý điều kiện và cuối cùng tôi sẽ giới thiệu đến các bạn độ ưu tiên giữa các toán tử trong Java.

Toán tử gán.

Toán tử Mô tả Ví dụ
= Gán giá trị từ các toán hạng bên phải cho toán hạng bên trái. a = 1 sẽ gán giá trị 1 cho a.
+= Cộng hoặc nối chuỗi toán hạng bên phải vào toán hạng bên trái và gán lại kết quả cho toán hạng bên trái. a += 1 (tương đương với a = a + 1).
-= Trừ toán hạng bên phải khỏi toán hạng trái và gán lại kết quả cho toán hạng bên trái. a -=1 (tương đương với a = a - 1).
*= Nhân toán hạng bên phải với toán hạng bên trái và gán lại kết quả cho toán hạng bên trái. a *= 2 (tương đương với a = a * 2).
/= Chia toán hạng bên phải cho toán hạng bên trái và gán lại kết quả cho toán hạng bên trái. a /= 2 (tương đương với a = a / 2).
%= Chia toán hạng bên phải cho toán hạng bên trái và lấy phần dư gán cho toán hạng bên trái. a %= 2 (tương đương với a = a % 2).

Toán tử số học.

Toán tử Mô tả
+ Toán tử cộng.
- Toán tử trừ.
* Toán tử nhân.
/ Toán tử chia.
% Toán tử chia lấy phần dư.

Toán tử 1 ngôi.

Toán tử Mô tả
+ Chỉ định giá trị không âm.
- Chỉ định giá trị âm.
++ Tăng giá trị của toán hạng đó lên 1 đơn vị.
-- Giảm giá trị của toán hạng đó đi 1 đơn vị.
! Phép toán phủ định trên một giá trị luận lý. Nếu một điều kiện đang nhận giá trị là true thì toán tử này sẽ thay đổi giá trị đó thành false và ngược lại.

Đối với toán tử ++ và -- thì trong Java có 2 loại đó là Prefix (tiền tố) và Postfix (hậu tố).

  • Đối với Prefix thì toán tử ++ hoặc -- sẽ nằm đằng sau toán hạng đó. Ví dụ: a++ hoặc a--.
  • Đối với Postfix thì toán tử ++ hoặc -- sẽ đứng đằng trước toán hạng đó. Ví dụ: ++a hoặc --a.

Vậy sự khác nhau giữa Prefix và Postfix là gì? Câu trả lời là nếu như toán hạng (biến) đó chỉ đứng một mình (ví dụ a++ hoặc a--) thì Postfix hay Prefix là giống nhau nhưng trường hợp đó rất ít khi xảy ra, bởi vì đối với những chương trình lớn và có tính phức tạp thì chúng ta thường phải giải quyết những biểu thức tổng hợp của nhiều toán tử. Vậy giả sử khi gặp những biểu thức tổng hợp này thì chúng ta phải giải quyết như thế nào? Tôi sẽ hướng dẫn các bạn trong ví dụ dưới đây:

Giả sử chúng ta có đoạn chương trình như sau:

Ví dụ
package toan_tu;

public class PostfixPrefix {

	public static void main(String[] args) {
		int firstVariable = 5, secondVariable = 7;
		int result = firstVariable++ + ++secondVariable - 8;
		System.out.println("First variable = " + firstVariable);
		System.out.println("Second variable = " + secondVariable);
		System.out.println("Third variable = " + result);
	}

}

Theo bạn, sau khi biên dịch đoạn chương trình thì giá trị của mỗi biến bằng bao nhiêu?

Khi gặp 1 vấn đề như vậy thì chúng ta thực hiện theo các bước như sau:

Bước 1: Ưu tiên xử lý Prefix trước.

Bước 2: Xử lý các phép toán còn lại.

Bước 3: Gán giá trị cho toán hạng nằm bên trái dấu bằng trước.

Bước 4: Xử lý Postfix.

Dựa theo các bước trên, chúng ta giải bài toán trên như sau:

Bước thực hiện Kết quả
Bước 1: Xử lý Prefix trước: Chúng ta nhận thấy trong đoạn chương trình trên có ++secondVariable là Prefix nên chúng ta xử lý trước. ++secondVariable = 7+ 1 = 8.
Bước 2: Xử lý các phép toán còn lại. 5 + 8 - 8 = 5.
Bước 3: Gán kết quả vừa có cho toán hạng bên trái. result = 5
Bước 4: Xử lý Postfix. firstVariable++ = 5 + 1= 6.

Kết quả cuối cùng là: firstVariable = 6, secondVariable = 8, result = 5.

Toán tử so sánh.

Toán tử Mô tả
== (So sánh bằng) So sánh giá trị của toán hạng bên trái và toán hạng bên phải có bằng nhau hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
!= (So sánh không bằng) So sánh giá trị của toán hạng bên trái và toán hạng bên phải có không bằng nhau hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
> (So sánh lớn hơn). So sánh giá trị của toán hạng bên trái có lớn hơn toán hạng bên phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
>= (So sánh lớn hơn hoặc bằng) So sánh giá trị của toán hạng bên trái có lớn hơn hoặc bằng toán hạng bên phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
< (So sánh nhỏ hơn) So sánh giá trị của toán hạng bên trái có nhỏ hơn toán hạng bên phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.
<= (So sánh nhỏ hơn hoặc bằng) So sánh giá trị của toán hạng bên trái có nhỏ hơn hoặc bằng toán hạng bên phải hay không. Nếu có thì kết quả trả về true, ngược lại trả về false.

Sau đâu tôi sẽ đưa ra ví dụ minh họa toán tử so sánh.

Ví dụ
package toan_tu;

import java.util.Scanner;

public class ToanTuSoSanh {
	public static void main(String[] args) {
		int firstVariable, secondVariable;
		Scanner scanner = new Scanner(System.in);
		System.out.println("Nhập vào số thứ nhất: ");
		firstVariable = scanner.nextInt();
		System.out.println("Nhập vào số thứ hai: ");
		secondVariable = scanner.nextInt();
		System.out.println("Kết quả của so sánh bằng " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable == secondVariable));
		System.out.println("Kết quả của so sánh không bằng " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable != secondVariable));
		System.out.println("Kết quả của so sánh lớn hơn " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable > secondVariable));
		System.out.println("Kết quả của so sánh lớn hơn hoặc bằng " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable >= secondVariable));
		System.out.println("Kết quả của so sánh nhỏ hơn " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable < secondVariable));
		System.out.println("Kết quả của so sánh nhỏ hơn hoặc bằng " + firstVariable + " và " + 
				secondVariable + " là " + (firstVariable <= secondVariable));
	}
}
Kết quả của ví dụ trên như sau:

Toán tử luận lý điều kiện.

Toán tử Mô tả
&& Phép toán luận lý VÀ (AND) trên 2 giá trị, Kết quả trả về true khi cả hai đều đúng.
|| Phép toán luận lý HOẶC (OR) trên 2 giá trị. Kết quả trả về false khi cả hai đều sai.
?: Toán tử điều kiện 3 ngôi.

Đoạn chương trình dưới đây sẽ giúp các bạn hiểu rõ hơn về toán tử luận lý điều kiện.

Ví dụ
package toan_tu;

import java.util.Scanner;

public class ToanTuLuanLyDieuKien {
	public static void main(String[] args) {
		int firstNumber, secondNumber;	
		
		Scanner scanner = new Scanner(System.in);
		System.out.println("Nhập vào số thứ nhất: ");
		firstNumber = scanner.nextInt();
		System.out.println("Nhập vào số thứ hai: ");
		secondNumber = scanner.nextInt();
		
		// Sử dụng toán tử luận lý điều kiện
		System.out.println("Kết quả của (firstNumber < 10) && (secondNumber < 10) là " +
				 ((firstNumber < 10) && (secondNumber < 10)));	// Toán tử AND
		System.out.println("Kết quả của (firstNumber < 10) || (secondNumber < 10) là " + 
				 ((firstNumber < 10) || (secondNumber < 10)));	// Toán tử OR
	}

}
Kết quả sau khi biên dịch chương trình:

Giải thích chương trình:

Khi biên dịch chương trình, tôi sẽ nhập vào firstNumber = 8 secondNumber = 12.

Bước 1: Trong toán tử AND các bạn nhận thấy tôi so sánh 2 số vừa nhập với 10, vì số thứ nhất = 8 nhỏ hơn 10 là đúng và số thứ hai = 12 nhỏ hơn 10 là sai và theo mô tả của toán tử AND thì biểu thức sẽ trả về kết quả đúng ⇔ cả hai biểu thức con đều đúng mà trong ví dụ này chỉ có 1 biểu thức con đúng nên trình biên dịch sẽ trả về kết quả là false.

Bước 2: Tương tự, trong toán tử OR các bạn nhận thấy 8 nhỏ hơn 10 là đúng và 12 nhỏ hơn 10 là sai và theo mô tả của toán tử OR thì biểu thức sẽ trả về kết quả sai ⇔ cả hai biểu thức con đều sai, nhưng trong trường hợp này chỉ có 1 biểu thức con sai nên kết quả của chương trình vẫn là true.

Độ ưu tiên giữa các toán tử.

Thứ tự Toán tử
1 Các toán tử 1 ngôi: +-++--
2 Các toán tử số học: */+-
3 Các toán tử: ><>=<===!=
4 Các toán tử luận lý điều kiện: &&||?:
5 Các toán tử gán: =*=, /=+=, -=

Trong một số trường hợp, chúng ta nên dùng dấu ngoặc tròn để nhóm các biểu thức lại để quy định độ ưu tiên giữa các toán tử. Dấu ngoặc tròn làm cho biểu thức rõ ràng, rõ nghĩa hơn và tránh được những sai sót trong quá trình thực thi biểu thức.

2. Ví dụ tổng hợp.

Viết chương trình tính thể tích và diện tích bề mặt của một hình cầu với bán kính r nhập vào từ bàn phím (r > 0). Kết quả chỉ cần lấy 2 chữ số thập phân. Công thức tính như sau:

Thể tích = (4/3) * PI * r3.

Diện tích bề mặt = 4 * PI * r2.

Hướng dẫn: Để làm tròn kết quả với 2 chữ số thập phân các bạn sử dụng lớp DecimalFormat theo cú pháp như sau: DecimalFormat decimalFormat = new DecimalFormat("#.##") với phần sau dấu chấm tương ứng với số chữ số thập phân cần lấy (ở đây chúng ta cần lấy 2 chữ số thập phân nên sẽ sử dụng 2 dấu ##).

Bài giải
package toan_tu;

import java.text.DecimalFormat;
import java.util.Scanner;

public class TinhDienTichVaTheTichHinhCau {
	public static final float PI = 3.14f;	// khai báo hằng số
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		// Khai báo lớp DecimalFormat dùng để định dạng số
		DecimalFormat decimalFormat = new DecimalFormat("#.##");
		
		System.out.println("Nhập vào bán kính hình cầu (r > 0): ");
		float radius = scanner.nextFloat();
		
		// Tính diện tích bề mặt hình cầu
		float area = 4 * PI * radius * radius;
		System.out.println("Diện tích hình cầu = " + decimalFormat.format(area));
		
		/*
		 *  Tính thể tích hình cầu
		 *  Lưu ý phải ép kiểu kết quả của 4/3 về số thực nếu không sẽ dẫn đến sai kết quả
		 */
		float vol = (float)4/3 * PI * radius * radius * radius;
		System.out.println("Thể tích hình cầu = " + decimalFormat.format(vol));
	}

}

Kết quả sau khi biên dịch chương trình:

3. Lời kết.

Đây là bài cuối cùng trong chương Tổng quan về Java. Trong chương này, chúng ta đã tìm hiểu tổng quan về Java, các thế mạnh đặc trưng của Java, các kiểu dữ liệu, cách khai báo biến và đặc biệt các toán tử thường dùng trong Java. Chương tiếp theo - chương Cấu trúc điều khiển sẽ giới thiệu các cấu trúc điều khiển và cách thức hoạt động và mục đích của nó trong các chương trình Java. Các bạn cố gắng theo dõi nhé!

Nguồn: freetuts.net