Чи 0 - десятковий буквальний чи восьмеричний буквальний?


329

Нуль завжди дорівнює нулю, тому це не має значення. Але в нещодавній дискусії з другом він сказав, що восьмеричні буквари сьогодні майже не використовуються. Потім мені зрозуміло, що насправді майже всі цілі букви в моєму коді є восьмеричними, а саме 0.

Чи 0є вісімковий буквал відповідно до граматики С ++? Що говорить стандарт?

Єдине реальне використання, про яке я знаю, - це дозволи на використання файлів Unix.


6
Це те ж саме для Java?
Філіп

80
+1 для того, щоб задати абсолютно нерелевантне питання та отримати багато грошей:
Керрек С.Б.,

64
Я вважаю, що спосіб миттєвого повторного відбору запитань не є глибоким питанням, а своєрідним запитанням, відповідь якого дозволить вам прислухатися до охолоджувача води :)
Джош

4
Страхітливе запитання :) Я шукав це у специфікації мови Java , а на Java це десятковий. Специфікація навіть містить таку цитату: Зверніть увагу, що восьмеричні цифри завжди складаються з двох або більше цифр; 0 завжди вважається десятковою цифрою - не те, що на практиці має велике значення, для цифр 0, 00 і 0x0 всі представляють однаково ціле значення.
Тобіас Рітзау

14
Я майже спокусився опублікувати відповідь, в якій сказано "Так, 0 - це десятковий буквальний чи восьмеричний буквальний".
Кіт Томпсон

Відповіді:


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: У вашій версії вам слід додатково вказати перевагу: Якщо обидва octal-literal та decimal-literalможливі інтерпретації байтового шаблону, виберіть octal-literal. Формулювання офіційного стандарту не має цієї проблеми.
Мартін Сойка

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- вісімкове значення. Тобто: 01 - восьмеричний 1, 010 - восьмеричний 10, що становить десятковий 8, а 0 - восьмеричний 0 (що є десятковим, а будь-яке інше - 0).

Так, так, "0" - вісімка.

Це звичайний англійський переклад фрагмента граматики у відповіді @ Als :-)


Ціле число з префіксом не0x є префіксом . є явно іншим префіксом. Мабуть, є люди, які не можуть цього розрізнити.00x

Відповідно до того самого стандарту, якщо ми продовжимо:

 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' і є цілим числом.
Микола Рухе

4
0xне є ознакою. Ціле число, що починається з, 0x- це один маркер.
Кіт Томпсон

4
Яке джерело ви цитуєте для цього визначення? Слово "маркер" визначається синтаксично стандартами C (N1570 6.4) та C ++ (C ++ 11 2.7 [lex.token]). 0xне кваліфікується. (Принаймні, в С, це число попередньої обробки (N1570 6.4.8), якщо воно не є частиною шістнадцяткової постійної, але це не маркер.)
Кіт Томпсон,

11
Ми обговорюємо синтаксис цілих констант / літералів, як визначено стандартами C і C ++ . Як визначення стандартів "маркер" не є найбільш підходящим для використання в цьому контексті? Ваша ображальна поблажливість недоречна. І якщо ви вважаєте, що я хуліган за те, що я вказав на те, що, на мою думку, є технічною помилкою у вашій відповіді, я пропоную вам переглянути значення цього слова. (Ви ніколи не відповідали на моє запитання щодо джерела вашого визначення.)
Кіт Томпсон,

4
Якщо хтось цікавий, твердження про те, що " Маркер - це рядок одного або декількох символів, який є значущим як група. ", Схоже на цю статтю у Вікіпедії .
Кіт Томпсон

-2

Мабуть, всі цілі букви, що починаються з нуля, насправді є восьмеричними. Це означає, що він включає і 0. Це має незначну різницю, оскільки нуль дорівнює нулю. Але не знаючи цього факту може завдати вам шкоди.

Я зрозумів це, коли намагався написати програму для перетворення двійкових чисел у десятковий та шістнадцятковий вихід. Щоразу, коли я давав число, починаючи з нуля, я отримував неправильний вихід (наприклад, 012 = 10, а не 12).

Добре знати цю інформацію, щоб ви не помилилися.


7
Цілі літерали, що починаються з нуля, але без 'x' після нуля.
luiscubal

5
Твердження "так" без доказів також не є відповіддю.
Гонки легкості на орбіті

1
За цією логікою 09 - восьмеричне число.
0xc0de

3
@ 0xc0de: Ні, 09це не вісімкове число, оскільки це зовсім не число; він не відповідає синтаксису для будь-якого виду цілого літералу.
Кіт Томпсон

7
Я впевнений, що @ 0xc0de знає, що 09це не вісімкове число. Що було сказано було: « За цією логікою , 09це вісімкове число.» Звідси випливає, що, оскільки 09це не вісімкове число, логіка повинна бути помилковою.
TRiG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.