2013-10-01 14 views
84

Xin giải thích những gì, chính xác, xảy ra khi các phần sau của mã được thực thi:Ngữ nghĩa Java của một số thoát trong một ký tự bằng chữ, ví dụ: ' 15'?

int a='\15'; 
System.out.println(a); 

này in ra 13;

int a='\25'; 
System.out.println(a); 

này in ra 21;

int a='\100'; 
System.out.println(a); 

này in ra 64.

+22

Có vẻ như nó đang diễn giải số dưới dạng bát phân. – Nikhil

+5

'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. –

+3

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

Trả lời

115

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 
+3

Tôi không thể tìm thấy nó trong phần 3.10.1 .. Đó là trong 3.10.4, Ký tự chữ số –

+1

Phần trên các chữ số nguyên không liên quan. Xem [Phần 3.10.4] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.4). Xem thêm [Phần 3.10.6] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html # jls-3.10.6) cho chuỗi ký tự và chuỗi thoát. –

+0

'1-3 chữ số' - nó phải là' 0-3'. Và số bát phân của nó cho bát phân có 3 chữ số, bát phân hai chữ số vẫn có thể có từ '0-7'. ví dụ '\ 77' vẫn hợp lệ. – Jayamohan

19

Ký hiệu \nnn biểu thị một mã ký tự bát phân trong Java. do đó, int a = '\15' gán giá trị tự động đúc của ký tự bát phân 15 đến a là số thập phân 13.

+5

Ký hiệu '\ nnn' không _not_ biểu thị số bát phân trong Java. Trong mã OP, nó biểu thị một chuỗi ký tự bát phân. Các dấu trích dẫn xung quanh là rất cần thiết. Nhân vật sau đó được mở rộng thành một giá trị số nguyên bằng cách gán. (Các số thập phân được biểu thị bằng một số không có chữ số hàng đầu.) –

+0

Điểm tốt; nên đã đề cập đến tự động đúc trong câu trả lời. Đã cập nhật câu trả lời. –

6

Thực tế là bạn đặt các chữ số trong dấu ngoặc kép làm cho tôi nghi ngờ nó đang diễn giải số đó dưới dạng ký tự. Các chữ số theo sau phải ở dạng bát phân.

Các vấn đề liên quan