c - шпаргалка - регулярные выражения. 3-е изд.




Является ли 0 восьмеричным или десятичным в C? (4)

Затем он спросил, почему он считается восьмеричным в 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 ASCII, за которой следует одна или несколько цифр ASCII от 0 до 7 с вкраплениями подчеркивания, и может представлять собой положительное, нулевое или отрицательное целое число.

Как видите, голый 0 считается десятичным . Тогда как любая (непустая) последовательность цифр, которой предшествует 0 , считается восьмеричной .

Интересно, что из этой грамматики:

  • 0 является десятичным
  • но 00 восьмеричное

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

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

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

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


Восьмеричный.

C11 §6.4.4.1 Целочисленные константы

octal-constant:
    0
    octal-constant octal-digit

И это так, поскольку C89 § 3.1.3.2 .


Это восьмеричное. См. Раздел 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 соответственно.

Это не имеет большого значения, но формально целочисленная константа 0 является восьмеричной в C. Из стандартов C99 и C11, 6.4.4.1 Целочисленные константы

целочисленная константа :
десятичная константа целочисленный суффикс опт
восьмеричная константа целочисленный суффикс опт
шестнадцатеричная константа целочисленный суффикс опт

десятичная константа :
ненулевая цифра
десятичная цифра

восьмеричная константа :
0
восьмеричная константа восьмеричная цифра

шестнадцатеричная константа :
...
...







octal