1. Biểu thức so với câu lệnh

Trong Java, sẽ rất hữu ích khi phân biệt giữa hai loại: câu lệnhbiểu thức . Một câu lệnh thường được cho là được thực thi , trong khi một biểu thức được cho là được đánh giá . Nhưng đó không phải là điều quan trọng nhất.

Sự khác biệt chính giữa một câu lệnh và một biểu thức là việc đánh giá một biểu thức có một kết quả . Và kết quả này có một loại và nó có thể được gán cho một biến hoặc được sử dụng trong một số biểu thức khác.

Ví dụ:

Mã số ghi chú
int x; Tuyên bố
(a < 10) Biểu thức có kiểu làboolean
i++; Biểu thức có kiểu giống với kiểu của ibiến
x = 5; Biểu thức có kiểu giống với kiểu của xbiến

Và điều này mang lại cho chúng ta điều gì?

Đầu tiên, chúng ta có thể tận dụng thực tế là nhiều câu lệnh thực sự là các biểu thức (có nghĩa là chúng đánh giá một giá trị). Ví dụ: mã như thế này sẽ hoạt động:

Mã số ghi chú
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

Thứ hai, nếu muốn, chúng ta có thể bỏ qua kết quả đánh giá một biểu thức.

Mã số Mã nơi chúng tôi bỏ qua kết quả:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Chúng tôi bỏ qua kết quả của việc đánh giá một biểu thức, ví dụ: nếu biểu thức liên quan đến việc làm điều gì đó hữu ích và hành động này là điều quan trọng đối với chúng tôi chứ không phải bản thân kết quả.


2. Toán tử bậc ba

Bản hack cuộc sống này đã thú vị hơn bản trước. Java có một toán tử bậc ba đặc biệt . Cú pháp của nó hơi giống với cú pháp của câu lệnh:if-else

Condition ? Expression 1 : Expression 2;

Nếu điều kiện đúng thì Biểu thức 1 được đánh giá, nếu không thì Biểu thức 2 được đánh giá. Điều kiện được theo sau bởi một dấu chấm hỏi và hai biểu thức được phân tách bằng dấu hai chấm .

Sự khác biệt chính giữa toán tử bậc ba và một if-elsecâu lệnh là toán tử bậc ba là một biểu thức, có nghĩa là chúng ta có thể gán kết quả của nó cho một thứ gì đó.

Ví dụ: giả sử chúng ta muốn tính số nhỏ nhất của hai số. Sử dụng toán tử bậc ba, mã này sẽ trông như thế này:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

Hoặc, giả sử bạn cần gán các giá trị khác nhau cho một biến tùy thuộc vào một số điều kiện. Làm thế nào để bạn làm điều đó?

Một tùy chọn là sử dụng một if-elsetuyên bố:

int age = 25;
int money;
if (age > 30)
   money = 100;
else
   money = 50;

Tùy chọn thứ hai là sử dụng toán tử bậc ba , nghĩa là viết tắt cho if-elsecâu lệnh:

int age = 25;
int money = age > 30 ? 100 : 50;

Vì vậy, cái nào tốt hơn để sử dụng - một if-elsecâu lệnh hay toán tử bậc ba ? Về tốc độ thực hiện, không có nhiều khác biệt. Đây là một vấn đề về khả năng đọc mã. Và đây là một điểm rất quan trọng: mã không chỉ hoạt động chính xác mà còn phải dễ đọc đối với các lập trình viên khác.

Quy tắc đơn giản nhất là: nếu mã nằm trên một dòng thì hãy sử dụng toán tử bậc ba ; nhưng nếu nó không vừa trên một dòng, thì tốt hơn là sử dụng một if-elsecâu lệnh.



3. So sánh các số thực

Như đã đề cập trước đó, bạn không thể lấy các số thực và so sánh chúng. Luôn có khả năng một số chữ số có nghĩa có thể bị loại bỏ, gây ra các tác dụng phụ không mong muốn.

Đó là lý do tại sao có một phương pháp thử nghiệm thời gian. Nếu hai số thực khác nhau một giá trị rất nhỏ thì có thể coi chúng bằng nhau. Ví dụ:

double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");

Nhưng đó không phải là tất cả những gì chúng ta phải lo lắng, vì sự khác biệt giữa các con số có thể trở thành âm. Vì vậy, để phương pháp này hoạt động, bạn không chỉ cần so sánh sự khác biệt giữa các số mà còn cả giá trị tuyệt đối của sự khác biệt giữa các số:|a-b|

Java có một phương thức tính giá trị tuyệt đối của một số: Math.abs():

int m = Math.abs(value);

Do đó, phiên bản đã sửa của ví dụ trên sẽ trông như thế này:

double a = 1.000001;
double b = 1.000002;

if ( Math.abs(b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");