Các phép toán và các biểu thức

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 29 - 33)

1. Thứ tự ưu tiên và qui tắc kết hợp thực hiện của các phép toán Bảng B3.3 Các phép toán trong Java

ST T

Tên gọi Các phép toán Qui tắc kết hợpthực hiện 1 Phép toán 1 ngôi

hậu tố (postfix)

[] . (tham_so) exp+

+ exp-- Th c hi n t trái qua ph i

ệ ừ

2 Phép toán 1 ngôi ti n ề

t (prefix)ố -exp ~++exp --exp +exp !

Th c hi n t ph i qua tráiự ệ ừ

3 T o l p ạ ậ đố ượi t ng

v ép ki uà new() (type) Th c hi n t ph i qua tráiự ệ ừ

4 Lo i phép nhânạ * / % Th c hi n t trái qua ph iự ệ ừ

5 Lo i phép c ngạ + - Th c hi n t trái qua ph iự ệ ừ

6 Phép toán quan hệ < <= >

>= instanceof Th c hi n t trái qua ph iự ệ ừ 7 Phép so sánh đẳng

th cứ == != Th c hi n t trái qua

ệ ừ

8 Phép v (AND) trênà

bitwise/boolean & Th c hi n t trái qua ph iự ệ ừ 9 Phép ho c lo i trặ

(XOR) trên bitwise/boolean

^ Th c hi n t trái qua ph iự ệ ừ

10 Phép ho c (OR) trênặ

bitwise/boolean | Th c hi n t trái qua ph i ự ệ ừ 11 Phép ho c (OR) logicặ || Th c hi n t ph i qua tráiự ệ ừ

12 Phép v (AND) logicà && Th c hi n t ph i qua tráiự ệ ừ

13 Phép toán i u ki nđ ề ?: Th c hi n t ph i qua tráiự ệ ừ

14 Các phép gán = += -= *= /= %= <<= >>= >>>= &= ^= |=

Th c hi n t ph i qua tráiự ệ ừ

2. Các qui tắc chuyển đổi kiểu ép kiểu

Qui tắc ép kiểu có dạng: (<type>) <exp>

 Lúc thực hiện hệ thống sẽ chuyển kết quả tính toán của biểu thức <exp> sangkiểu được ép là <type>.

 Ví dụ: float f = (float) 100.15D; // Chuyển số 100.15 dạng kiểu double sang float

Lưu ý:

 Không cho phép chuyển đổi giữa các kiểu nguyên thủy với kiểu tham chiếu, ví dụ kiểu double không thể ép sang các kiểu lớp như HocSinh được.

 Kiểu giá trị boolean (logic) không thể chuyển sang các kiểu dữ liệu số và ngược lại.

Mở rộng và thu hẹp kiểu

 Giá trị của kiểu hẹp hơn (chiếm số byte ít hơn) có thể được chuyển sang những kiểu rộng hơn (chiếm số byte nhiều hơn) mà không tổn thất thông tin. Cách chuyển kiểu đó được gọi là mở rộng kiểu.

Hình H3-2 Các qui tắc mở rộng kiểu Ví dụ:

char c = ‘A’;

int k = c; // mở rộng kiểu char sang kiểu int (mặc định)

 Chuyển đổi kiểu theo chiều ngược lại, từ kiểu rộng về kiểu hẹp hơn được gọi là thu hẹp kiểu. Lưu ý là thu hẹp kiểu có thể dẫn tới mất thông tin.

 Cuối cùng chúng ta cũng cần lưu ý về ngữ cảnh phải thực hiện chuyển đổi kiểu:

 Thực hiện các lời gọi hàm (phương thức) với các tham biến kiểu nguyên thủy hay kiểu tham chiếu,

 Thực hiện tính toán các biểu thức số học,

 Ghép các xâu kết hợp các đối tượng của lớp String và các kiểu dữ liệukhác.

3. Các phép toán số học

Các phép toán số học được chia thành hai loại:

1. Các phép toán 1 ngôi (đơn nguyên): + (cộng) và - (trừ), các phép đổi dấu,

2. Các phép toán 2 ngôi (nhị nguyên): * (nhân), / (chia), % (lấy modul – phép chia lấy số dư), + (cộng) và - (trừ).

Lưu ý:

- Thứ tự kết hợp thực hiện của các phép toán số học đơn nguyên là từ phải qua trái:

int val = - -20; // (- (-20)) cho 20

- Chú ý giữa 2 phép toán đơn nguyên là phải có dấu cách.

- Thứ tự kết hợp thực hiện của các phép toán số học nhị nguyên là từ trái qua phải:

int newVal = 10 % 4 * 4; // ((10 % 4) * 4) cho 8

int iVal = newVal / 5; // Thực hiện chia nguyên và cho kết quả là 1

- Lúc thực hiện, các toán hạng phải được tính toán từ trái qua phải trước khi áp dụng với phép toán. Khi 2 toán hạng khác nhau về kiểu thì thực hiện chuyển đổi kiểu như trên đã đề cập.

- Phép chia nguyên (2 toán hạng đều là kiểu nguyên) đòi hỏi số chia phải khác 0.

int iV = 10 / 0; // Sinh lỗi ngoại lệ số học: ArithmeticException - Phép chia số thực (ít nhất một toán hạng kiểu số thực) cho phép chia

cho 0 và kết quả phép chia cho 0.0 là INF (số lớn vô cùng) hoặc –INF (số âm vô cùng), hai hằng đặc biệt trong Java.

float n, m = 4.5 / 0.0; // Cho m là INF n = -4.5 /0.0; // Cho n là -INF

- Trong Java, phép chia lấy số dư % thực hiện được cả đối với số thực. float m = 11.5 % 2.5; // Cho m là 1.5

- Khi sử dụng các phép toán đơn nguyên đối với các đối số kiểu byte, short, hoặc char thì trước tiên toán hạng phải được tính rồi chuyển về kiểu int và kết quả là kiểu int. Ví dụ:

byte b1, b = 4; // OK số 4 kiểu int nhưng cho phép thu hẹp kiểu mặc định về byte

b = - b; // Lỗi vì -b có kết quả kiểu int do vậy thu hẹp kiểu đòi // hỏi phải tường minh

b1 = (byte) -b; // Hoàn toàn đúng

short h = 30; // OK: 30 kiểu int chuyển về short (mặc định đối với hằng nguyên

h = h + 4; // Lỗi vì h + 4 cho kết quả kiểu int vì thế không thể gán trực tiếp và

// cho h kiểu short. Nhưng,

h = (short) (h+4); // lại đúng hoặc có thể viết h = h + (short)4;

Các phép gán số học mở rộng

 Đối với các phép gán số học mở rộng thì qui tắc cú pháp trên tương đương ngữ nghĩa với lệnh sau:

<var> = (<type>) (<var> <op> (<exp>));

 Trong đó <type> là các kiểu số và <op> là phép toán số học +, -, *, /, %. Bảng B3.5 mô tả chi tiết hơn các phép gán số học mở rộng.

Bảng B3.5 Các phép gán số học mở rộng

Các phép gán logic mở rộng

 Các phép gán logic mở rộng được định nghĩa chi tiết như trong bảng B3.6.

 Bảng B3.6 Các phép gán logic mở rộng

 Các lệnh gán Cho b và biểu thức e kiểu boolean

Ví dụ:

int v0 = - 42; char v1 = ‘)’; // 41 byte v2 = 13;

Các phép toán so sánh đẳng thức

 Các phép toán so sánh <, <=, >, >= của Java được định nghĩa giống như trong các ngôn ngữ lập trình khác (như C chẳng hạn). Trong đó chỉ cần lưu ý là 2 đối số phải là các biểu thức số.

 So sánh đẳng thức trên các giá trị kiểu nguyên thủy: ==, != Cho trước hai toán hạng a, b có kiểu dữ liệu nguyên thủy.

 a == b a và b có bằng nhau không?, nghĩa là nếu chúng có các giá trị kiểu nguyên thủy bằng nhau thì cho kết quả đúng (true), ngược lại cho sai(false).

 a != b a và b có khác nhau không?, nghĩa là nếu chúng có các giá trị kiểu nguyên thủy không bằng nhau thì cho kết quả đúng (true),ngược lại cho sai (false).

Lưu ý:

và căn cứ vào thứ tự thực hiện vì có thể tất cả các toán hạng đều có kiểu số nhưng biểu thức vẫn không hợp lệ, hoặc ngược lại khi các đối số có kiểu khác nhau nhưng vẫn hợp lệ. Ví dụ:

int a, b, c; a = b = c = 10;

boolean hl = a == b == c; // Sai bởi phải thực hiện a == b

cho giá trị true,

// sau đó so với c (giá trị số) thì 2 đối số khác kiểu. boolean hl1 = a == b == true; // Lại hợp lệ.

So sánh đẳng thức trên các tham chiếu đối tượng: ==, !=

 Cho trước r và s là hai biến tham chiếu. Các phép so sánh đẳng thức trên các biến tham chiếu được xác định như sau:

r == s Cho giá trị true nếu r, s cùng tham chiếu tới cùng một trị (đối tượng), ngược lại sẽ cho giá trị false.

r != s Cho giá trị true nếu r, s không cùng tham chiếu tới cùng một trị (đối tượng), ngược lại sẽ cho giá trị false.

 Hai phép toán này được sử dụng để kiểm tra xem hai biến có chỉ tới cùng một đối tượng hay không.

Lưu ý: Các toán hạng phải có kiểu tương thích (chuyển đổi giữa chúng được mặc định), nếu không thì phải thực hiện ép kiểu.

Ví dụ 3.4 So sánh qua tham chiếu

class SV{

String hTen; int tuoi;

SV(String ht){ // Toán tử tạo lập đối tượng mới hTen = ht;

}

public static void main(String[] args){

SV sv1 = new SV(“Lan Anh”); // Tạo ra 1 đối tượng mới SV sv2 = new SV(“Lan Anh”); // Tạo ra 1 đối tượng mới SV sv3 = new SV(“Tran Anh”); // Tạo ra 1 đối tượng mới boolean t1 = sv1 == sv2; // false boolean t2 = sv1 == sv3; // false SV sv4 = sv2; boolean t3 = sv4 == sv2; // true System.out.println(“ t1 = ” + t1); System.out.println(“ t2 = ” + t2); System.out.println(“ t3 = ” + t3); } }

Một phần của tài liệu Lap Trinh huong doi tuong JAVA (Trang 29 - 33)

Tải bản đầy đủ (DOC)

(149 trang)
w