Ngữ nghĩa Java của một số thoát trong một ký tự, ví dụ: '\ 15' là gì?


85

Vui lòng giải thích chính xác điều gì sẽ xảy ra khi các phần mã sau được thực thi:

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

cái này in ra 13;

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

cái này in ra 21;

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

cái 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 chardựa trên số bát phân "15" (số thập phân 13, dưới dạng ký tự, đó là ascii "Carriage Return"), sau đó bạn đúc lại thành một intsố nguyên. Điều này là hợp pháp vì các ký tự là số nguyên 16 bit, vì vậy đây là một bản upcast an toàn và không có thông báo nào về 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.
Mike 'Pomax' Kamermans

Câu trả lời:


116

Bạn đã gán một ký tự ký tự, được phân tách bằng dấu nháy đơn, ví dụ 'a'(khác với ký tự chuỗi, được phân cách bằng dấu ngoặc kép, ví dụ "a") cho một intbiến. Java thực hiện phép truyền tự động mở rộng từ 16-bit chưa được ký charthành 32-bit có dấu int.

Tuy nhiên, khi một ký tự chữ là một dấu gạch chéo ngược theo sau bởi 1-3 chữ số, thì đó là một biểu diễn bát phân ( cơ số / cơ số 8) của ký tự. Như vậy:

  • \15= 1 × 8 + 5 = 13 (dấu xuống dòng; giống như '\r')
  • \25 = 2 × 8 + 5 = 21 (ký tự NAK - xác nhận phủ định)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (ký hiệu @; giống như '@')

Để biết thêm thông tin về ký tự ký tự và chuỗi thoát, hãy xem phần JLS:

Trích dẫn 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, Literals Character
Rafi Kamal

1
Phần về các ký tự số nguyên là không liên quan. Xem Phần 3.10.4 . Cũng xem Phần 3.10.6 để biết trình tự thoát ký tự và chuỗi.
Ted Hopp

1-3 digits- lẽ ra phải như vậy 0-3. Và nó đối với bát phân 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

6
@Jayamohan Ý tôi là 1-3 về số lượng chứ không phải giá trị
Bohemian

@Bohemian. Câu trả lời hay đấy. Tôi khuyên bạn nên thêm cú pháp của chữ thoát bát phân ở đây, vì vậy nó sẽ rõ ràng hơn. :)
Rohit Jain

19

Ký hiệu \nnnbiểu thị một mã ký tự bát phân trong Java. vì vậy int a = '\15'chỉ định giá trị tự động ép kiểu của ký tự bát phân 15 cho giá trị athập phân 13.


5
Các ký hiệu \nnnnào không biểu thị một số bát phân trong Java. Trong mã của OP, nó biểu thị một chuỗi thoát ký tự bát phân. Các dấu ngoặc kép xung quanh là điều cần thiết. Sau đó, ký tự được mở rộng thành giá trị số nguyên bằng phép gán. (Số bát phân được biểu thị bằng một chữ số zero hàng đầu.)
Ted Hopp

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

6

Việc bạn đặt các chữ số trong dấu ngoặc kép khiến tôi nghi ngờ rằng nó đang diễn giải số dưới dạng một ký tự theo nghĩa đen. Các chữ số theo sau phải ở dạng bát phân.

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.