Toán tử bậc ba trong Java chỉ đánh giá một biểu thức kể từ Java 7 - điều đó có khác trong Java 1.6 trở xuống không?


109

Chuẩn bị cho kỳ thi 1 Lập trình viên Java SE 8 được chứng nhận Oracle Certified Associate, tôi đã xem qua đoạn văn sau về biểu thức bậc ba trong Hướng dẫn ôn tập chính thức:

Đánh giá
biểu thức bậc ba Kể từ Java 7, chỉ một trong các biểu thức bên phải của toán tử bậc ba sẽ được đánh giá trong thời gian chạy. Theo cách tương tự như các toán tử ngắn mạch, nếu một trong hai biểu thức bên phải trong toán tử bậc ba thực hiện một hiệu ứng phụ, thì nó có thể không được áp dụng trong thời gian chạy. Hãy minh họa nguyên tắc này bằng ví dụ sau: [...]

Nó nói rằng chỉ một trong hai biểu thức được đánh giá, chứng minh bằng ví dụ sau:

int y = 1;
int z = 1;
int a = y < 10 ? y++ : z++;

Ở đây, chỉ số ygia tăng, nhưng zkhông, như bạn mong đợi.

Những gì tôi tình cờ gặp là đầu đoạn văn (được đánh dấu màu vàng) có nội dung "Kể từ Java 7, ...". Tôi đã thử nghiệm mã tương tự với Java 1.6 và tôi không thể tìm thấy sự khác biệt trong hành vi. Tôi mong đợi Java 1.6 đánh giá cả hai biểu thức chỉ từ thông tin được đưa ra trong đoạn văn. Có ai biết họ muốn nói gì với "Như Java 7, ..." không?

Chỉnh sửa: Để tránh nhầm lẫn: Câu hỏi tóm tắt là, Vì họ viết 'Kể từ Java 7', có điều gì thay đổi liên quan đến toán tử bậc ba, khi chuyển từ Java 6 sang Java 7 không?


4
Tại sao bạn lại mong đợi z cũng được tăng lên? Điều này không có ý nghĩa gì đối với tôi.
Jiří Kantor

15
âm thanh giống như một cuốn sách kém bằng văn bản, ternary nhà khai thác đã không thay đổi kể từ beginging của java, afaik
NimChimpsky

23
Đọc hầu hết các câu trả lời được đăng cho đến nay, mọi người dường như hiểu sai câu hỏi. Đó không phải là "Tại sao cả hai biểu thức đều không được đánh giá?", Mà là "Tại sao cuốn sách này dường như ngụ ý rằng nó từng cư xử khác nhau?"
BambooleanLogic

23
Trên thực tế, tôi đã thấy "As of date / version X" được sử dụng có nghĩa là "Chúng tôi đã kiểm tra xem điều này có đúng vào ngày / trong phiên bản X nhưng chúng tôi không nói gì về các phiên bản trước đó." Tôi đoán đó có thể là ý nghĩa ở đây. (Mặc dù bạn nghĩ sẽ đủ dễ dàng để kiểm tra các phiên bản Java trước đó.) Dù sao, đó là vấn đề tiếng Anh nhiều hơn là vấn đề lập trình.
David Z

14
@DavidZ: Vấn đề tiếng Anh là vấn đề lập trình khi chúng ngăn bạn hoàn thành công việc. Lời bình luận tồi tệ này đã khiến OP dừng việc anh ta đang làm và lãng phí thời gian để khám phá ra rằng KHÔNG CÓ GÌ ĐÃ THAY ĐỔI. Lập trình là giao tiếp, với trình biên dịch / thông dịch và với bất kỳ ai đến sau để duy trì mã của bạn. Tôi không thể đếm được số lần mà tôi đã đọc một số mã và phải dừng lại vì điều gì đó kỳ lạ mà / có thể / đã liên quan đến vấn đề, chỉ để phát hiện ra rằng nó đã bị "phrased" một cách tồi tệ.
jmoreno

Câu trả lời:


92

Tôi là một trong những tác giả của cuốn sách này đến từ. Trong khi tôi không viết câu cụ thể đó, tôi đồng ý rằng mục đích là "điều này đã được thử nghiệm trên Java 7". Tôi sẽ ghi chú để xóa nó nếu chúng tôi viết một ấn bản khác.

Để rõ ràng, toán tử bậc ba đã hoạt động theo cách tương tự trong Java 8, 7, 6, v.v. Và tôi sẽ khá ngạc nhiên nếu nó thay đổi trong tương lai.


116

Từ Java 6 JLS :

Tại thời điểm chạy, biểu thức toán hạng đầu tiên của biểu thức điều kiện được đánh giá đầu tiên; nếu cần, chuyển đổi mở hộp được thực hiện trên kết quả; giá trị boolean kết quả sau đó được sử dụng để chọn biểu thức toán hạng thứ hai hoặc thứ ba:

  • Nếu giá trị của toán hạng đầu tiên là true, thì biểu thức toán hạng thứ hai được chọn.
  • Nếu giá trị của toán hạng đầu tiên là false, thì biểu thức toán hạng thứ ba được chọn.

Sau đó, biểu thức toán hạng đã chọn được đánh giá và giá trị kết quả được chuyển đổi thành kiểu của biểu thức điều kiện như được xác định bởi các quy tắc nêu trên. Chuyển đổi này có thể bao gồm chuyển đổi quyền anh (§5.1.7) hoặc chuyển đổi mở hộp. Biểu thức toán hạng không được chọn không được đánh giá cho đánh giá cụ thể đó của biểu thức điều kiện.

Từ ngữ tương tự cũng xuất hiện trong các phiên bản JLS trở về 1.0 . Hành vi không thay đổi trong Java 7; hướng dẫn nghiên cứu chỉ là từ ngữ kém.


2
Vì vậy, câu trả lời là "Không có sự khác biệt như Java 7 và trước đó, liên quan đến toán tử bậc ba", phải không?
Mathias Bader

5
Có vẻ hợp pháp. Tôi đã viết một bản ghi nhớ với các tác giả - mong câu trả lời của họ
Mathias Bader

Bạn cũng có thể tìm thấy một URL so sánh mã của toán tử giữa các phiên bản. Nếu bạn hoang tưởng / tò mò.
Steve Clay

7
Số lượng câu hỏi viết sai (hoặc chỉ sai) trong các chứng chỉ Oracle này mỗi lần một lần nữa lại đáng kinh ngạc ..
Voo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.