ความหมาย Java ของจำนวน Escape ในอักขระลิเทอรัลคืออะไรเช่น '\ 15'


85

โปรดอธิบายว่าเกิดอะไรขึ้นเมื่อดำเนินการส่วนต่อไปนี้ของโค้ด:

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

สิ่งนี้พิมพ์ออกมา 13;

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

สิ่งนี้พิมพ์ออกมา 21;

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

สิ่งนี้พิมพ์ออกมา 64


22
ดูเหมือนว่ากำลังตีความตัวเลขเป็นฐานแปด
Nikhil

5
int a='\15'ขั้นแรกให้สร้างcharตามเลขฐานแปด "15" (ทศนิยม 13 เป็นอักขระเป็นอักขระ ascii "Carriage Return") ซึ่งคุณจะสร้างใหม่เป็นintจำนวนเต็ม สิ่งนี้ถูกกฎหมายเนื่องจากตัวอักษรเป็นจำนวนเต็ม 16 บิตดังนั้นจึงมีการอัปเดตที่ปลอดภัยและไม่มีการแจ้งเตือนเกี่ยวกับการหล่อโดย Java คำตอบอื่น ๆ ครอบคลุมสิ่งที่เป็นฐานแปด / ทศนิยมทั้งหมดอยู่แล้ว
Mike 'Pomax' Kamermans

คำตอบ:


116

คุณได้กำหนดอักขระลิเทอรัลซึ่งคั่นด้วยเครื่องหมายคำพูดเดี่ยวเช่น'a'(แตกต่างจากสตริงลิเทอรัลซึ่งคั่นด้วยเครื่องหมายคำพูดคู่เช่น"a") ให้กับintตัวแปร Java ทำการขยายการร่ายแบบอัตโนมัติจาก 16 บิตที่ไม่ได้ลงนามcharกับ 32 intบิตลงนาม

อย่างไรก็ตามเมื่ออักขระลิเทอรัลเป็นแบ็กสแลชตามด้วยตัวเลข 1-3 หลักจะเป็นเลขฐานแปด ( ฐาน / รัศมี 8) ของอักขระ ดังนั้น:

  • \15 = 1 × 8 + 5 = 13 (การกลับรถเช่นเดียวกับ '\r' )
  • \25 = 2 × 8 + 5 = 21 (อักขระ NAK - การตอบรับเชิงลบ)
  • \100= 1 × 64 + 0 × 8 + 0 = 64 (สัญลักษณ์ @ เหมือนกับ'@')

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับลิเทอรัลอักขระและลำดับการหลีกดูส่วน JLS:

อ้างBNFจาก 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
หาไม่เจอในหัวข้อ 3.10.1 .. อยู่ใน 3.10.4 Character Literals
Rafi Kamal

1
ส่วนบนลิเทอรัลจำนวนเต็มไม่เกี่ยวข้อง โปรดดูมาตรา 3.10.4 ดูหัวข้อ 3.10.6สำหรับลำดับอักขระและสตริง Escape
Ted Hopp

1-3 digits- 0-3มันควรจะได้รับ และ 3 0-7ฐานแปดหลักสองหลักฐานแปดสามารถยังคงมีจาก เช่น "\ 77" ยังใช้ได้
Jayamohan

6
@Jayamohan ฉันหมายถึงปริมาณ 1-3 ไม่ใช่มูลค่า
โบฮีเมียน

@ โบฮีเมียน. คำตอบที่ดี ฉันขอแนะนำให้คุณเพิ่มไวยากรณ์ของลิเทอรัลหนีฐานแปดที่นี่เพื่อให้ชัดเจนยิ่งขึ้น :)
Rohit Jain

19

สัญกรณ์\nnnแสดงรหัสอักขระฐานแปดใน Java ดังนั้นint a = '\15'กำหนดค่าที่ร่ายโดยอัตโนมัติของอักขระเลขฐานแปดaซึ่งเป็นทศนิยม 13


5
สัญกรณ์\nnnไม่ได้แสดงถึงเลขฐานแปดใน Java ในรหัสของ OP จะแสดงลำดับการหลบหนีของอักขระเลขฐานแปด เครื่องหมายคำพูดโดยรอบเป็นสิ่งสำคัญ จากนั้นอักขระจะถูกขยายเป็นค่าจำนวนเต็มโดยการกำหนด (เลขฐานแปดแสดงด้วยเลขศูนย์นำหน้า)
Ted Hopp

จุดดี; ควรจะกล่าวถึงการส่งอัตโนมัติในคำตอบ อัปเดตคำตอบ
Bahman Movaqar

6

การที่คุณใส่ตัวเลขในเครื่องหมายคำพูดทำให้ฉันสงสัยว่ามันกำลังตีความตัวเลขเป็นตัวอักษร ตัวเลขที่ตามมาจะต้องเป็นเลขฐานแปด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.