Есть 0 восьмеричное и десятичное в C? [дубликат]
этот вопрос уже есть ответ здесь:
Я прочитала этой. Это восьмеричное в C++ и десятичное в Java. Но нет описания о C?
будет ли иметь значение, если 0 является восьмеричным или десятичным? Это вопрос мой интервьюер. Я сказал нет, и я объяснил, что это всегда 0 независимо от того, восьмеричной или десятичной.
затем он спросил, почему он считается восьмеричным в C++ и десятичным в Java. Я сказал, что это стандарт. Пожалуйста, дайте мне знать, что это в C? Будет ли это иметь какое-то значение? Почему они отличаются в разных стандартах?
6 ответов:
это не имеет большого значения, но формально целочисленная константа
0
является восьмеричным в C. от стандартов C99 и C11,6.4.4.1 целочисленные константыцелое число-постоянный:
десятичная-константацелое число-суффикс opt
восьмеричная-константацелое число-суффикс opt
шестнадцатиричный-постоянный целое число-суффикс optдесятичная-константа:
ненулевой цифры
десятичная-константацифрывосьмеричная-константа:
0
восьмеричная-константавосьмеричная-цифрашестнадцатиричный-постоянный:
...
...
восьмеричной.
C11 §6.4.4.1 целочисленные константы
octal-constant: 0 octal-constant octal-digit
и это верно, поскольку C89 §3.1.3.2.
затем он спросил, почему он считается восьмеричным в C++ и десятичным в 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
как видите, голый
0
считается decimal. В то время как любая (непустая) последовательность цифр, предшествующая0
считается восьмеричной.интересно, что из этой грамматики:
0
это десятичное- но
00
это восьмеричный
Это восьмеричное. Смотрите раздел
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 соответственно.
из стандарта C (6.4.4.1 целочисленные константы)
octal-constant: 0 octal-constant octal-digit
на самом деле нет никакой разницы для нуля, потому что ноль является общей цифрой для восьмеричных, десятичных и шестнадцатеричных чисел. Он имеет смысл только тогда, когда число имеет другие цифры, кроме одного (ведущего) нуля.
примите во внимание, что не существует таких интегральных типов, как десятичный, восьмеричный или шестнадцатеричный.
Я думаю, что это зависит от реализации компилятора. Мы должны увидеть исходный код, чтобы определить, помечает ли он константу "0" как восьмеричную или нет. Я могу определить не восьмеричное причина в Таким образом: Octals имеет префикса "0". Но приставки нет. Если константа равна 00, то это восьмеричный - "восьмеричный ноль":)