0 คือตัวอักษรทศนิยมหรือตัวอักษรฐานแปด?


329

Zero เป็นศูนย์เสมอดังนั้นมันไม่สำคัญ แต่ในการสนทนาเมื่อเร็ว ๆ นี้กับเพื่อนเขาบอกว่าตัวอักษรฐานแปดแทบไม่ได้ใช้ในปัจจุบัน จากนั้นก็จะเริ่มขึ้นเมื่อฉันที่จริงเกือบทุกตัวอักษรของจำนวนเต็มในรหัสของฉันมี0ฐานแปดคือ

คือ0ฐานแปดตัวอักษรตามที่ c ++ ไวยากรณ์? มาตรฐานพูดอะไร

การใช้งานจริงเท่านั้นที่ฉันรับรู้คือการอนุญาตให้ใช้ไฟล์ unix


6
นี่เป็นสิ่งเดียวกันสำหรับ Java หรือไม่?
ฟิลิปป์

80
+1 สำหรับถามคำถามที่ไม่เกี่ยวข้องทั้งหมดและรับ upvotes มากมาย :-)
Kerrek SB

64
ผมคิดว่าวิธีการที่ตัวแทนในทันทีดังนั้นไม่ได้เป็นคำถามที่ลึกซึ้ง แต่เป็นคำถามที่แปลกประหลาดที่มีคำตอบที่จะที่ดินคุณ geek cred ที่น้ำเย็น :)
จอช

4
คำถามที่ยอดเยี่ยม :) ฉันค้นหาในJava Language Specและใน Java เป็นทศนิยม ข้อมูลจำเพาะมีเครื่องหมายคำพูดต่อไปนี้: โปรดทราบว่าตัวเลขฐานแปดจะประกอบด้วยตัวเลขสองหลักหรือมากกว่าเสมอ 0 ถือว่าเป็นเลขทศนิยมเสมอ - ไม่ใช่ว่ามันมีความสำคัญในทางปฏิบัติสำหรับตัวเลข 0, 00 และ 0x0 ทั้งหมดแสดงถึงค่าจำนวนเต็มเดียวกันทั้งหมด
Tobias Ritzau

14
ฉันเกือบอยากโพสต์คำตอบที่บอกว่า "ใช่ 0 คือตัวอักษรทศนิยมหรือตัวอักษรฐานแปด"
Keith Thompson

คำตอบ:


296

ใช่0เป็นตัวอักษรแปดตัวใน C ++

ตามมาตรฐาน C ++:

2.14.2 ตัวอักษรจำนวนเต็ม [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
จุดสำคัญอื่น ๆ ที่เป็นที่ทศนิยมที่แท้จริงคือการเป็นศูนย์หลักตามด้วยศูนย์หรือมากกว่าหลักดังนั้นจึงไม่มีความคลุมเครือ
CB Bailey

3
@MSalters: กับรุ่นของคุณคุณต้อง additionaly ระบุการตั้งค่า: ถ้าทั้งสอง octal-literalและการตีความเป็นไปได้ของรูปแบบไบต์ที่รับdecimal-literal octal-literalถ้อยคำมาตรฐานอย่างเป็นทางการไม่มีปัญหานี้
Martin Sojka

23
@MSalters: คุณยังคงไม่มีทศนิยมตามตัวอักษรของตัวเลขใด ๆ มันจะต้องเป็นศูนย์เดียวหรือไม่ใช่ศูนย์ตามด้วยตัวเลขใด ๆ มิฉะนั้นทุกตัวอักษรแปดจะตีความได้ว่าเป็นตัวอักษรทศนิยม ฉันเห็นข้อผิดพลาดในการคอมไพล์ในตอนนี้: ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey

3
@MSalters ในตัวอย่างของคุณ 0123 จะจับคู่ทั้งแปดตัวอักษรและทศนิยม แต่จะมีความหมายต่างกัน
ปุย

5
@CharlesBailey - FTFY โดย1ยังคงเป็นเลขฐานแปดและทั้งหมด; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg

44

ค่าจำนวนเต็มใด ๆ ที่นำหน้าด้วย0เป็นค่าฐานแปด Ie: 01 คือ octal 1, 010 คือ octal 10 ซึ่งเป็นทศนิยม 8 และ 0 คือ octal 0 (ซึ่งเป็นทศนิยมและอื่น ๆ 0)

ดังนั้นใช่ '0' จึงเป็นเลขฐานแปด

นั่นเป็นคำแปลภาษาอังกฤษแบบธรรมดาของตัวอย่างไวยากรณ์ในคำตอบของ @ Als :-)


จำนวนเต็มนำหน้าด้วย0xจะไม่0นำหน้าด้วย 0xเป็นคำนำหน้าที่แตกต่างอย่างชัดเจน เห็นได้ชัดว่ามีคนที่ไม่สามารถแยกความแตกต่างนี้

ตามมาตรฐานเดียวกันถ้าเราดำเนินการต่อ:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
"ค่าจำนวนเต็มใด ๆ ที่ขึ้นต้นด้วย '0' คือค่าฐานแปด" ไม่จริง. ตัวอย่าง: 0xA เริ่มต้นด้วย '0' และเป็นค่าจำนวนเต็ม
Nikolai Ruhe

4
0xไม่ใช่โทเค็น ตัวอักษรจำนวนเต็มเริ่มต้นด้วย0xเป็นโทเค็นเดียว
Keith Thompson

4
แหล่งข้อมูลใดที่คุณอ้างถึงสำหรับคำจำกัดความนั้น คำว่า "เข็ม" ถูกกำหนดsyntacticallyโดย C (N1570 6.4) และ C ++ (C ++ 11 2.7 [lex.token]) มาตรฐาน 0xไม่มีคุณสมบัติ (อย่างน้อยใน C เป็นหมายเลขที่ประมวลผลล่วงหน้า (N1570 6.4.8) หากไม่ใช่ส่วนหนึ่งของค่าคงที่ฐานสิบหก แต่นั่นไม่ใช่โทเค็น)
Keith Thompson

11
เรากำลังพูดถึงไวยากรณ์ของจำนวนเต็มคงที่ / ตัวอักษรตามที่กำหนดโดย C และ C ++ มาตรฐาน คำจำกัดความของมาตรฐานของ "โทเค็น" ไม่ใช่คำที่เหมาะสมที่สุดที่จะใช้ในบริบทนี้ การดูถูกเหยียดหยามของคุณไม่เหมาะสม และถ้าคุณคิดว่าฉันเป็นคนพาลที่ชี้ให้เห็นสิ่งที่ฉันคิดว่าเป็นข้อผิดพลาดทางเทคนิคในคำตอบของคุณฉันขอแนะนำให้คุณพิจารณาความหมายของคำนั้นอีกครั้ง (คุณไม่เคยตอบคำถามของฉันเกี่ยวกับแหล่งที่มาของคำจำกัดความของคุณ)
Keith Thompson

4
ถ้าใครอยากรู้อยากเห็นคำว่า " โทเค็นเป็นสตริงของหนึ่งหรือมากกว่าตัวอักษรที่มีความสำคัญเป็นกลุ่ม. " ปรากฏขึ้นมาจากบทความวิกิพีเดียนี้
Keith Thompson

-2

เห็นได้ชัดว่าทุกตัวอักษรของจำนวนเต็มเริ่มต้นด้วยการเป็นศูนย์ในความเป็นจริงฐานแปด หมายความว่ามี 0 เช่นกัน สิ่งนี้สร้างความแตกต่างเล็กน้อยเนื่องจากศูนย์เป็นศูนย์ แต่ไม่ทราบว่าความจริงข้อนี้สามารถทำร้ายคุณได้

ฉันรู้สิ่งนี้เมื่อฉันพยายามเขียนโปรแกรมเพื่อแปลงเลขฐานสองเป็นเอาต์พุตทศนิยมและเลขฐานสิบหก ทุกครั้งที่ฉันให้ตัวเลขเริ่มต้นด้วยศูนย์ฉันได้รับผลลัพธ์ที่ไม่ถูกต้อง (ตัวอย่างเช่น 012 = 10 ไม่ใช่ 12)

เป็นการดีที่จะทราบข้อมูลนี้เพื่อให้คุณไม่ทำผิดพลาดเหมือนกัน


7
ตัวอักษรจำนวนเต็มเริ่มต้นด้วยศูนย์ แต่ไม่มี 'x' หลังจากที่ศูนย์
luiscubal

5
การยืนยันว่า "ใช่" โดยไม่มีข้อพิสูจน์ไม่ได้เป็นคำตอบเช่นกัน
การแข่งขัน Lightness ใน Orbit

1
โดยตรรกะนี้ 09 เป็นเลขฐานแปด
0xc0de

3
@ 0xc0de: ไม่09ไม่ใช่ตัวเลขฐานแปดเพราะไม่ใช่ตัวเลขเลย มันไม่ตรงกับไวยากรณ์ของตัวอักษรจำนวนเต็มชนิดใด ๆ
Keith Thompson

7
ผมค่อนข้างมั่นใจว่า @ 0xc0de รู้ว่า09ไม่ได้เป็นตัวเลขฐานแปด อะไรคือสิ่งที่บอกว่าเป็น " โดยตรรกะนี้ , 09เป็นเลขฐานแปด." ความหมายคือว่าตั้งแต่09เป็นไม่ได้ตัวเลขฐานแปดตรรกะต้องผิด
TRiG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.