Является ли 0 восьмеричным или десятичным числом в C?
Я прочитал этот. Он восьмеричный в С++ и десятичный в Java. Но никакого описания о C?
Разве это будет иметь значение, если 0 является восьмеричным или десятичным? Это вопрос, заданный моим интервьюером. Я сказал "нет", и я объяснил, что он всегда 0 независимо от того, является ли он восьмеричным или десятичным.
Затем он спросил, почему он считается восьмеричным в С++ и десятичным в Java. Я сказал, что это стандарт. Пожалуйста, дайте мне знать, что это такое на C? Будет ли это иметь значение? Почему они отличаются по разным стандартам?
Ответы
Ответ 1
Это мало чем отличается, но формально целочисленная константа 0
является восьмеричной в C. Из стандартов C99 и C11 6.4.4.1 Целочисленные константы
целочисленная константа:
decimal-constant integer-suffix opt
восьмеричное целое число-суффикс opt
шестнадцатеричное целое число-суффикс opt
десятичная-константа:
ненулевая цифра
цифра с десятичной константой
восьмеричная-константа:
0
восьмеричная восьмеричная цифра
шестнадцатеричное-константа:
...
...
Ответ 2
восьмиштырьковый.
C11 §6.4.4.1 Целочисленные константы
octal-constant:
0
octal-constant octal-digit
И это верно, так как C89 §3.1.3.2.
Ответ 3
Затем он спросил, почему он считается восьмеричным в С++ и десятичным в Java
Для полноты, стоит упомянуть спецификации Java, а также. Из Спецификация языка Java 3.10.1:
DecimalNumeral:
0
NonZeroDigit Digitsopt
NonZeroDigit Underscores Digits
Десятичная цифра представляет собой либо одиночную цифру ASCII 0, представляющую целочисленный нуль, либо состоящую из цифры ASCII от 1 до 9, за которой следует одна или несколько цифр ASCII от 0 до 9, чередующихся с символами подчеркивания, представляющие положительное целое число.
OctalNumeral:
0 OctalDigits
0 Underscores OctalDigits
Октальная цифра состоит из цифры ASCII 0, за которой следует одна или несколько цифр ASCII от 0 до 7, чередующихся с символами подчеркивания, и могут представлять собой положительное, нулевое или отрицательное целое число.
Как вы можете видеть, голый 0
считается десятичным.
В то время как любая (непустая) последовательность цифр, предшествующая 0
, считается восьмеричной.
Интересно, что из этой грамматики:
-
0
является десятичным
- но
00
- восьмеричный
Ответ 4
Это восьмеричное. См. Раздел 6.4.4.1 Integer constants
черновика N1570:
integer-constant:
decimal-constant integer-suffixopt
octal-constant integer-suffixopt
hexadecimal-constant integer-suffixopt
decimal-constant:
nonzero-digit
decimal-constant digit
octal-constant:
0
octal-constant octal-digit
hexadecimal-constant:
hexadecimal-prefix hexadecimal-digit
hexadecimal-constant hexadecimal-digit
hexadecimal-prefix: one of
0x 0X
nonzero-digit: one of
1 2 3 4 5 6 7 8 9
octal-digit: one of
0 1 2 3 4 5 6 7
hexadecimal-digit: one of
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
integer-suffix:
unsigned-suffix long-suffixopt
unsigned-suffix long-long-suffix
long-suffix unsigned-suffixopt
long-long-suffix unsigned-suffixopt
unsigned-suffix: one of
u U
long-suffix: one of
l L
long-long-suffix: one of
ll LL
также:
- Десятичная константа начинается с ненулевой цифры и состоит из последовательности десятичных цифр. Октальная константа состоит из префикса 0, необязательно, за которым следует только последовательность цифр от 0 до 7. Шестнадцатеричная константа состоит из префикса 0x или 0X, за которым следует последовательность десятичных цифр и букв a (или A) через f (или F) со значениями от 10 до 15 соответственно.
Ответ 5
Из стандарта C (6.4.4.1 Целочисленные константы)
octal-constant:
0
octal-constant octal-digit
На самом деле нет никакой разницы для нуля, потому что нуль является общей цифрой для восьмеричных, десятичных и шестнадцатеричных чисел. Это имеет смысл только тогда, когда число имеет другие цифры, кроме единственного (ведущего) нуля.
Учтите, что таких интегральных типов нет, как десятичных, восьмеричных или шестнадцатеричных.
Ответ 6
Я думаю, что это зависит от реализации компилятора. Мы должны видеть исходный код, чтобы определить, будет ли он содержать константу "0" как восьмеричную или нет. Я могу определить неоктальную причину таким образом: Окталты имеют префикс "0". Но префикса нет. Если константа равна 00, то она является восьмеричной - "восьмеричная нуль":)