CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này những cạm bẫy xảy ra khi kết hợp với các biểu thức ? trong Java được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này thì nhớ like nhé.
Lời nói đầu.
Trước hết, tôi vừa đi nghỉ về và có chút thời gian rảnh nên đã lấy ra một dự án mà tôi đã viết trước đó một số câu hỏi về thuật toán và tiếp tục viết. Tôi muốn sửa đổi cách sắp xếp chèn trong đó để hỗ trợ tăng dần và tăng dần. theo thứ tự giảm dần thì hố này xuất hiện, cụ thể như thế này:
Trước tiên, hãy bố trí mã để sắp xếp chèn.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/**
* Sắp xếp chèn
* @param mảng đầu vào mảng
* @param thứ tự 1 là thứ tự tăng dần 0 là thứ tự giảm dần
*/
tĩnh
vô hiệu
chènsắp xếp(
số nguyên
mảng[],
số nguyên
đặt hàng){
vì
(
số nguyên
tôi =
1
; i < chiều dài mảng; i++)
{
số nguyên
lấy = arr[i];
số nguyên
j = tôi -
1
;
trong khi
(j >=
0
&& (thứ tự ==
1
) ? (arr[j] > lấy):(arr[j] < lấy))
{
arr[j +
1
] = mảng[j];
j--;
}
arr[j +
1
] = lấy;
}
}
|
Chức năng chính được gọi như thế này:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
công cộng
tĩnh
vô hiệu
main(chuỗi[] args){
số nguyên
[] mảng = {
8
,
96
,
23
,
5
,
6
,
43
};
vì
(
số nguyên
một :arr){
hệ thống.out.print(a +
","
);
}
system.out.println();
chèn sort(arr,
1
);
vì
(
số nguyên
một :arr){
hệ thống.out.print(a +
","
);
}
system.out.println();
chèn sort(arr,
0
);
vì
(
số nguyên
một :arr){
hệ thống.out.print(a +
","
);
}
}
|
Nhật ký sau khi chạy như thế này:
8,96,23,5,6,43, ngoại lệ trong luồng "main" java.lang.arrayindexoutofboundsexception: -1 。
Ngoại lệ có nghĩa là mảng nằm ngoài giới hạn và vấn đề nằm ở dòng này.
?
1
|
trong khi
(j >=
0
&& (thứ tự ==
1
) ? (arr[j] > lấy):(arr[j] < lấy))
|
Trong mã, j sẽ giảm đi 1 mỗi lần lặp cho đến khi không đáp ứng được điều kiện nào. Sau khi gỡ lỗi, người ta nhận thấy rằng ngoại lệ xảy ra khi j=-1, nhưng vấn đề là khi j=-1, mảng sẽ xảy ra. không được sử dụng. Bởi vì ai cũng biết rằng && là một phép toán ngắn mạch, nghĩa là nếu toán hạng đầu tiên có thể xác định kết quả thì toán hạng thứ hai sẽ không được đánh giá. biểu thức sau sẽ không được đánh giá, nhưng các phép tính được thực hiện ở đây và các giá trị được lấy từ mảng, do đó ngoại lệ này xảy ra.
Tôi cũng đã viết một số mã ngẫu nhiên để kiểm tra tình huống này:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/**
* So sánh kích thước của hai tham số đầu vào
* @param một tham số đầu vào 1
* @param b tham số đầu vào 2
* @return boolean nếu a > b trả về true, nếu không trả về false
*/
tĩnh
Boolean
so sánh(
số nguyên
Một,
số nguyên
b){
hệ thống.out.println(a +
">"
+ b +
"?"
);
system.out.println(a > b);
trở lại
a > b;
}
công cộng
tĩnh
vô hiệu
main(chuỗi[] args){
số nguyên
một =
1
;
số nguyên
b =
2
;
số nguyên
c =
3
;
Boolean
kết quả = so sánh(a, a) && (a ==
1
) ? (so sánh(b,b)):(so sánh(c,c));
system.out.println();
kết quả = so sánh(b, b) && so sánh(c, c);
}
|
Có một chức năng so sánh kích thước ở đây. Chức năng này sẽ in nhật ký để cho chúng ta xem rõ ràng các biểu thức trước và sau && đã được chạy chưa.
b trong biểu thức && đầu tiên là biểu thức ? và b trong biểu thức && thứ hai là hàm so sánh.
1>1? sai 3>3? sai 2>2? SAI.
Từ kết quả log, chúng ta có thể thấy rõ rằng khi b là một biểu thức thì b vẫn sẽ chạy khi a không đúng, nhưng khi b không phải là một biểu thức thì b sẽ không được thực thi nếu a sai.
Tóm tắt.
Trên đây là toàn bộ nội dung bài viết mong rằng nội dung bài viết có giá trị tham khảo nhất định cho quá trình học tập, làm việc của mọi người. Nếu có thắc mắc gì có thể để lại tin nhắn để trao đổi.
Liên kết gốc: https://www.cnblogs.com/xxbbtt/p/10346564.html.
Cuối cùng, bài viết về những cạm bẫy xảy ra khi kết hợp với các biểu thức ? trong Java kết thúc tại đây. Nếu bạn muốn biết thêm về những cạm bẫy xảy ra khi kết hợp với các biểu thức ? trong Java, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục Duyệt qua các bài viết liên quan. mong bạn sẽ ủng hộ blog của mình trong tương lai nhé! .
Tôi là một lập trình viên xuất sắc, rất giỏi!