Есть 0 восьмеричное и десятичное в C? [дубликат]


этот вопрос уже есть ответ здесь:

Я прочитала этой. Это восьмеричное в C++ и десятичное в Java. Но нет описания о C?

будет ли иметь значение, если 0 является восьмеричным или десятичным? Это вопрос мой интервьюер. Я сказал нет, и я объяснил, что это всегда 0 независимо от того, восьмеричной или десятичной.

затем он спросил, почему он считается восьмеричным в C++ и десятичным в Java. Я сказал, что это стандарт. Пожалуйста, дайте мне знать, что это в C? Будет ли это иметь какое-то значение? Почему они отличаются в разных стандартах?

6 61

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

также:

  1. десятичная константа начинается с ненулевой цифры и состоит из последовательности десятичных цифр. Восьмеричная константа состоит из префикса 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, то это восьмеричный - "восьмеричный ноль":)