โปรดอธิบายว่าเกิดอะไรขึ้นเมื่อดำเนินการส่วนต่อไปนี้ของโค้ด:
int a='\15';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 13;
int a='\25';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 21;
int a='\100';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 64
โปรดอธิบายว่าเกิดอะไรขึ้นเมื่อดำเนินการส่วนต่อไปนี้ของโค้ด:
int a='\15';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 13;
int a='\25';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 21;
int a='\100';
System.out.println(a);
สิ่งนี้พิมพ์ออกมา 64
int a='\15'
ขั้นแรกให้สร้างchar
ตามเลขฐานแปด "15" (ทศนิยม 13 เป็นอักขระเป็นอักขระ ascii "Carriage Return") ซึ่งคุณจะสร้างใหม่เป็นint
จำนวนเต็ม สิ่งนี้ถูกกฎหมายเนื่องจากตัวอักษรเป็นจำนวนเต็ม 16 บิตดังนั้นจึงมีการอัปเดตที่ปลอดภัยและไม่มีการแจ้งเตือนเกี่ยวกับการหล่อโดย Java คำตอบอื่น ๆ ครอบคลุมสิ่งที่เป็นฐานแปด / ทศนิยมทั้งหมดอยู่แล้ว
คำตอบ:
คุณได้กำหนดอักขระลิเทอรัลซึ่งคั่นด้วยเครื่องหมายคำพูดเดี่ยวเช่น'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
1-3 digits
- 0-3
มันควรจะได้รับ และ 3 0-7
ฐานแปดหลักสองหลักฐานแปดสามารถยังคงมีจาก เช่น "\ 77" ยังใช้ได้
สัญกรณ์\nnn
แสดงรหัสอักขระฐานแปดใน Java ดังนั้นint a = '\15'
กำหนดค่าที่ร่ายโดยอัตโนมัติของอักขระเลขฐานแปดa
ซึ่งเป็นทศนิยม 13
\nnn
ไม่ได้แสดงถึงเลขฐานแปดใน Java ในรหัสของ OP จะแสดงลำดับการหลบหนีของอักขระเลขฐานแปด เครื่องหมายคำพูดโดยรอบเป็นสิ่งสำคัญ จากนั้นอักขระจะถูกขยายเป็นค่าจำนวนเต็มโดยการกำหนด (เลขฐานแปดแสดงด้วยเลขศูนย์นำหน้า)
การที่คุณใส่ตัวเลขในเครื่องหมายคำพูดทำให้ฉันสงสัยว่ามันกำลังตีความตัวเลขเป็นตัวอักษร ตัวเลขที่ตามมาจะต้องเป็นเลขฐานแปด