Bạn đã chỉ định một ký tự chữ, được giới hạn bởi dấu nháy đơn, ví dụ như 'a'
(để phân biệt với một String đen, được giới hạn bởi dấu ngoặc kép, ví dụ "a"
) với biến số int
. Java thực hiện phép mở rộng tự động từ số không ký hiệu 16 bit char
đến 32 bit đã ký int
.
Tuy nhiên, khi ký tự bằng chữ là dấu gạch chéo ngược, sau đó là 1-3 chữ số, thì đó là ký hiệu đại diện của ký tự đó là octal (base/radix 8). Như vậy:
\15
= 1 × 8 + 5 = 13 (một trở về vận chuyển; giống như '\r'
)
\25
= 2 × 8 + 5 = 21 (một char NAK - thừa nhận tiêu cực)
\100
= 1 × 64 + 0 × 8 + 0 = 64 (biểu tượng @; giống như '@'
)
Để biết thêm về literals nhân vật và mã escape, xem phần JLS:
Trích dẫn các BNF từ 3.10.6:
OctalEscape:
\ OctalDigit
\ OctalDigit OctalDigit
\ ZeroToThree OctalDigit OctalDigit
OctalDigit: one of
0 1 2 3 4 5 6 7
ZeroToThree: one of
0 1 2 3
Có vẻ như nó đang diễn giải số dưới dạng bát phân. – Nikhil
'int a = '\ 15'' đầu tiên tạo một' char' dựa trên số bát phân "15" (số thập phân 13, như một char, đó là ascii "Carriage Return"), sau đó bạn recast thành một số nguyên 'int' . Điều này là hợp pháp vì ký tự là số nguyên 16 bit, do đó, nó là một upcast an toàn và không có thông báo về việc truyền được phát hành bởi Java. Các câu trả lời khác bao gồm toàn bộ số bát phân/thập phân. –
bản sao có thể có của [Tại sao '\ 117' là một ký tự hợp lệ trong Java?] (Http://stackoverflow.com/questions/14950593/why-is-117-a-valid-character-literal-in-java) – gparyani