Является ли 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

также:

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