Thứ tự ưu tiên của các toán tử và sự kết hợp

Một phần của tài liệu Học lập trình Java qua ví dụ (Trang 28 - 33)

Khi một biểu thức chứa nhiều toán tử, chúng sẽ được thực hiện theo một thứ tự xác định bởi thứ tự ưu tiên của nó. Thứ tự ưu tiên của các toán tử toán học tuân theo các nguyên tắc số học. Nếu không chắc chắn, ta dùng dấu ngoặc đơn để thay đổi thứ tự ưu tiên.

Xét biểu thức 5+3*2, nó được tính 5+(3*2) bằng 11, chứ không tính (5+3)*2 bằng 16. Toán tử (*) có độ ưu tiên cao hơn toán tử (+), do vậy phép nhân được thực hiện trước.

Xét biểu thức 8-3-2, nó được tính (8-3)-5 bằng 3, chứ không tính 8-(3-2) bằng 7. Vì vậy , khi biểu thức có nhiều toán tử - thì độ ưu tiên (sự kết hợp) được thực hiện từ trái sang phải.

Hai toán tử + và – có cùng độ ưu tiên. Nên cũng được thực hiện từ trái sang phải. Xét biểu thức:

x + 3 – y +5 (x + 3) – y +5 ((x + 3) – y) +5 ((x + 3) – y +5)

Các toán tử =, += và -= có cùng độ ưu tiên nhưng được thực hiện từ phải sang trái trong cùng biểu thức. Xét biểu thức:

x = y += z -= 4 x = y += (z -= 4) x = (y += (z -= 4))

Chương 2 Biến và toán tử

29/114 (x = y += (z -= 4))

Dùng dấu ngoặc đơn để thay đổi thứ tự ưu tiên của các toán tử. Nếu không dùng nó thì độ ưu tiên và sự kết hợp sẽ được dùng để xác định thứ tự các toán tử sẽ thực thi. Khoảng trắng không có tác dụng.

Thứ tự ưu tiên được thực hiện như sau:

 Trong một biểu thức các toán tử được thực hiện theo thứ tự ưu tiên từ cao xuống thấp (tightest binding)

 Nếu có nhiều hơn 1 toán tử ưu tiên như nhau trong biểu thức thì thực hiện từ trái sang phải

 Hãy đặt các biểu thức ưu tiên nhất trong dấu ngoặc tròn để chúng được thực hiện trước nhất.

 Tiếp tục với biểu thức con thứ hai và các biểu thức tiếp theo

 Tiếp đến các toán tử có độ ưu tiên cao nhất còn lại theo cùng qui trình trên.

Rất dễ bị sai nếu quên đi thứ tự ưu tiên. Hãy xem biểu thức sau:

x = a+b/5.0-c**d+1*e

là tương đương với

x = ((a+(b/5.0))-(c**d))+ (1*e)

Tuân theo qui trình sau để đóng ngoặc các biểu thức

 Toán tử ưu tiên cao nhất là **. Nghĩa là c**d được thực hiện trước tiên, ta đóng nó trong ngoặc tròn.

 Dấu / và dấu * là toán tử ưu tiên cao nhất thứ hai, sẽ được thực hiện kế tiếp, do vậy đặt b/5.01*e vào ngoặc tròn.

 Dấu + và – có độ ưu tiên cao nhất kế tiếp. Do chúng có cùng độ ưu tiên với nhau nên thực hiện từ trái sang phải.

 Cuối cùng phép gán được thực hiện.

2.4.3 Ép kiểu

Ép kiểu hay chuyển đổi kiểu hàm ý nói đến việc thay đổi kiểu dữ liệu của một biến sang kiểu khác. Thực hiện điều này ta thu được một số tinh năng ưu việt

của thang bậc các dữ liệu. Chẳng hạn, các giá trị giới hạn của một tập các số nguyên integer có thể chứa trong một khuôn dạng cô đọng hơn. Có thể chuyển đổi kiểu sang dạng khác phù hợp với việc tính toán hơn vì không thể tính toán với kiểu dữ liệu trước đó, chẳng hạn như là chia các số với độ chính xác cao hơn. Trong ngôn ngữ lập trình hướng đối tượng, chuyển đổi kiểu cho phép chương trình xem đối tượng của một kiểu như là kiểu tiền bối của chúng để làm đơn giản việc tương tác với chúng.

Có 2 loại chuyển kiểu: mặc định và tường minh. Thuật ngữ chuyển kiếu mặc định có nghĩa là nâng kiểu. Hầu hết các dạng chuyển kiểu tường minh được hiểu là ép kiểu. Chuyển kiểu tường minh cũng có thể thu được từ các thường trình chuyển kiểu được viết riêng như là nạp chồng hàm dựng của đối tượng.

Chuyển kiểu ngầm định

Chuyển kiểu ngầm định, cũng còn gọi là nâng kiểu (coercion), là tự động chuyển kiểu bởi trình biên dịch. Một số ngôn ngữ cho phép, thậm chí đòi hỏi bộ biên dịch phải hỗ trợ chuyển kiểu. (adsbygoogle = window.adsbygoogle || []).push({});

Trong một biểu thức phức hợp, chương trình sẽ chạy đúng nếu dữ liệu của kiểu dưới có thể chuyển lên kiểu trên.

Đoạn lệnh 10 mô tả chuyển kiểu mặc định.

short a=2000; int b;

b=a;

Ở đây giá trị ‟a‟ được nâng cấp từ short lên int và không cần toán tử ép kiểu nào cả. Điều này được hiểu là chuyển kiểu thông thường. Chuyển kiểu thông thường tác động trên các kiểu dữ liệu cơ bản, cho phép chuyển đổi các dữ liệu số (short lên int, int lên float, float lên double...) và một số chuyển đổi con trỏ. Một số chuyển đổi có thể gây ra mất độ chính xác, lúc ấy trình biên dịch có thể cảnh báo. Điều này có thể không cần đến chuyển kiểu tường minh.

Chuyển kiểu tường minh

Nhiều loại chuyển kiểu, đặc biệt là hạ thấp kiểu gây mất dữ liệu, đòi hỏi chuyển kiểu tường minh.

Đoạn lệnh 11 mô tả chuyển kiểu tường minh

short a=2000; int b;

Chương 2 Biến và toán tử

31/114

b= int (a); // cú pháp kiểu hàm

Có nhiều loại ép kiểu tường minh, đó là:  Có kiểm tra

Trước khi chuyển kiểu được thực hiện, một kiểm tra trong lúc chạy chương trình được thực hiện để xem kiểu đích đến có chứa được giá trị nguồn hay không. Nếu không, một lỗi bị sinh ra.

 Không kiểm tra

Không có kiểm tra nào được thực hiện. Nếu kiểu đích không chứa được giá trị gốc, kết quả không được ghi nhận.

 Mẫu bit

Dữ liệu không được xem xét gì tất, các bít thô được sao chép nguyên bản.

Tóm tắt bài học

 Biến là một tên được dùng để tham chiếu đến các giá trị chỉ định trong chương trình.

 Hằng là giá trị không đổi được viết thẳng trong mã lệnh không đòi hỏi sự tính toán nào cả.

 Java có các loại dữ liệu có sẵn, gọi là dữ liệu nguyên thủy.

 Định dạng dữ liệu để xuất ra người ta dùng lớp Formatter hoặc sử dụng các phương thức format() và printf() của lớp PrintStream.

 Một số các ký tự đặc biệt được biểu diễn kết hợp với dấu \

 Java cung cấp nhiều loại toán tử, đó là  Toán tử số học

 Toán tử bit  Toán tử quan hệ  Toán tử logic  Toán tử điều kiện  Toán tử gán

AptechVietnam 33/114

Một phần của tài liệu Học lập trình Java qua ví dụ (Trang 28 - 33)