0 est-il octal ou décimal en C? [dupliquer]

cette question a déjà une réponse ici:

j'ai lu ce . C'est octal en C++ et décimal en Java. Mais pas de description de C?

va-t-il faire différence si 0 est octal ou décimal? C'est la question posée par mon interlocuteur. J'ai dit non et j'ai expliqué qu'il est toujours 0, qu'il soit octal ou décimal.

alors il a demandé pourquoi est-il considéré comme octal en C++ et décimal en Java. Je l'ai dit c'est la norme. S'il vous plaît, dites-moi ce qu'il y a en C? Vont-il faire une différence? Pourquoi sont-elles différentes selon les normes?

61
demandé sur Community 2014-10-29 11:02:03

6 réponses

il fait peu de différence, mais formellement la constante entière 0 est octal en C. des normes C99 et C11, 6.4.4.1 constantes entières

constante entière :

     décimal-constant entier-suffixe opt

     octal-constant entier-suffixe opt

     hexadécimal-constante entier-suffixe opt

décimal-constant :

     non nul 1519100920 "
     décimal-constant chiffre

constante octale :

     0

     octal-constant octal chiffres

hexadécimal-constante :

    ...

    ...

92
répondu juanchopanza 2014-10-30 12:07:23

Octal.

C11 §6.4.4.1 constantes entières

octal-constant:
    0
    octal-constant octal-digit

et cela depuis C89 §3.1.3.2 .

59
répondu Yu Hao 2014-10-29 08:16:14

alors il a demandé pourquoi est-il considéré comme octal en C++ et décimal en Java

par souci d'exhaustivité, il vaut la peine de mentionner les spécifications Java. De Java Language Specification 3.10.1 :

DecimalNumeral:
    0
    NonZeroDigit Digitsopt
    NonZeroDigit Underscores Digits

un chiffre décimal est soit le chiffre ASCII simple 0, représentant le zéro entier, ou se compose d'un chiffre ASCII de 1 à 9 éventuellement suivi d'un ou plusieurs chiffres ASCII de 0 à 9 intercalés de underscores, représentant un nombre entier positif.

OctalNumeral:
    0 OctalDigits
    0 Underscores OctalDigits

un chiffre octal se compose d'un chiffre ASCII 0 suivi d'un ou plusieurs des chiffres ASCII 0 à 7 entrecoupés de underscores, et peut représenter un nombre entier positif, zéro ou négatif.

comme vous pouvez le voir, un nu 0 est considéré comme décimal . Attendu que toute séquence (non vide) de chiffres précédée de 0 est considérée comme octal .

assez intéressant, de cette grammaire:

  • 0 est décimal
  • mais 00 est octal
29
répondu Sylvain Leroux 2014-10-29 10:54:13

c'est un octal. Voir la section 6.4.4.1 Integer constants du projet de 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

aussi:

  1. une constante décimale commence par un chiffre non nul et consiste en une séquence de chiffres décimaux. Une constante octale se compose du préfixe 0, éventuellement suivi d'une séquence des chiffres 0 à 7 seulement. Une constante hexadécimale se compose du préfixe 0x ou 0X suivi d'une séquence des décimales et des lettres a (ou A) à f (ou F) avec des valeurs de 10 à 15 respectivement.
11
répondu starrify 2014-10-29 08:07:39

de la norme C (6.4.4.1 constantes entières)

octal-constant:
0
octal-constant octal-digit

en fait, il n'y a aucune différence pour zéro parce que Zéro est un chiffre commun pour les nombres octal, décimal et hexadécimal. Il n'a de signification que lorsqu'un nombre a d'autres chiffres que le seul zéro (en tête).

tenir compte du fait qu'il n'existe pas de types intégraux tels que décimal, octal ou hexadécimal.

10
répondu Vlad from Moscow 2014-10-29 08:07:09

je pense que cela dépend de l'implémentation du compilateur. Nous devons voir le code source pour déterminer s'il affiche une constante "0" comme octal ou non. Je peux définir la raison non-octale de cette façon: Octals a le préfixe "0". Mais il n'y a pas de préfixe. Si la constante est 00, Alors c'est octal - "octal Zero":)

-2
répondu i486 2014-10-31 13:56:04