0 é um literal decimal ou um octal?

329

Zero é sempre zero, então não importa. Mas em uma discussão recente com um amigo, ele disse que os literais octais são quase inutilizados hoje. Então me dei conta de que quase todos os literais inteiros no meu código são octais, a saber 0.

É 0um octal literal de acordo com a gramática do C ++? O que diz o padrão?

O único uso real que tenho conhecimento é para permissões de arquivo unix.

Yakov Galka
fonte
6
É o mesmo para Java?
Philippe
80
+1 para pedir uma questão totalmente irrelevante e recebendo toneladas de upvotes :-)
Kerrek SB
64
Eu acho que a maneira de rep instantânea no SO não é uma questão profunda, mas uma questão peculiar cuja resposta iria pousar você totó cred no refrigerador de água :)
Josh
4
Ótima pergunta :) Eu procurei no Java Language Spec e em Java é decimal. A especificação contém até a seguinte citação: Observe que os números octais sempre consistem em dois ou mais dígitos; 0 é sempre considerado um número decimal - não que isso importe muito na prática, pois os números 0, 00 e 0x0 representam exatamente o mesmo valor inteiro.
Tobias Ritzau
14
Estou quase tentado a postar uma resposta que diz "Sim, 0 é um literal decimal ou um octal".
Keith Thompson

Respostas:

296

Sim, 0é um literal octal em C ++.

Conforme o padrão C ++:

2.14.2 Literais inteiros [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit
Alok Save
fonte
39
O outro ponto importante é que um literal decimal é um dígito diferente de zero seguido por zero ou mais dígitos, portanto não há ambiguidade.
perfil completo de CB Bailey
3
@MSalters: Com a sua versão, você também precisa especificar a preferência: Se as duas interpretações forem possíveis octal-literale decimal-literalo padrão de bytes, escolha octal-literal. A redação do padrão oficial não apresenta esse problema.
Martin Sojka
23
@ MSalters: Você ainda não poderia ter literal decimal como qualquer número de dígitos, teria que ser um único zero ou um dígito diferente de zero seguido de qualquer dígito, caso contrário, todo literal octal poderia ser interpretado como literal decimal. Eu posso ver o erro de compilação, agora: ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey
3
@MSalters No seu exemplo, 0123 corresponderia a literal octal e decimal literal, mas teria significados diferentes de qualquer maneira.
fofo
5
@CharlesBailey - FTFY, com 1ainda sendo octal e tudo; PERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg
44

Qualquer valor inteiro prefixado com 0é um valor octal. Ou seja: 01 é octal 1, 010 é octal 10, que é decimal 8 e 0 é octal 0 (que é decimal, e qualquer outro, 0).

Então sim, '0' é um octal.

Essa é uma tradução simples em inglês do snippet de gramática na resposta da @ Als :-)


Um número inteiro prefixado com não0x é prefixado com . é um prefixo explicitamente diferente. Aparentemente, existem pessoas que não podem fazer essa distinção.00x

Conforme esse mesmo padrão, se continuarmos:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit
littleadv
fonte
5
"Qualquer valor inteiro começando com '0' é um valor octal." Não é verdade. Exemplo: 0xA começa com '0' e é um valor inteiro.
Nikolai Ruhe 01/03
4
0xnão é um token. Um literal inteiro começando com 0xé um único token.
Keith Thompson
4
Qual fonte você está citando para essa definição? A palavra "token" é definida sintaticamente pelos padrões C (N1570 6.4) e C ++ (C ++ 11 2.7 [lex.token]). 0xnão se qualifica. (Pelo menos em C, é um número de pré-processamento (N1570 6.4.8) se não é parte de uma constante hexadecimal, mas isso não é um token.)
Keith Thompson
11
Estamos discutindo a sintaxe de constantes inteiras / literais, conforme definido pelos padrões C e C ++ . Como a definição de "token" dos padrões não é a mais apropriada para uso neste contexto? Sua condescendência insultante é inadequada. E se você acha que sou um valentão por apontar algo que considero um erro técnico em sua resposta, sugiro que você reconsidere o significado dessa palavra. (Você nunca respondeu à minha pergunta sobre a fonte de sua definição.)
Keith Thompson
4
Se alguém estiver curioso, a declaração de que " um token é uma sequência de um ou mais caracteres significativos como um grupo " parece ser deste artigo da Wikipedia .
Keith Thompson
-2

Aparentemente, todos os literais inteiros começando com zero são de fato octais. Isso significa que ele inclui 0 também. Isso faz pouca diferença, já que zero é zero. Mas não conhecer esse fato pode machucá-lo.

Percebi isso quando estava tentando escrever um programa para converter números binários em saídas decimais e hexidecimais. Toda vez que eu estava dando um número começando com zero, estava obtendo a saída errada (por exemplo, 012 = 10, não 12).

É bom conhecer essas informações para não cometer o mesmo erro.

MCG
fonte
7
Literais inteiros começando com zero, mas sem o 'x' após o zero.
luiscubal
5
Uma afirmação "sim" sem prova também não é uma resposta.
Lightness Races em Órbita
1
Por essa lógica, 09 é um número octal.
0xc0de
3
@ 0xc0de: Não, 09não é um número octal, porque não é um número; não corresponde à sintaxe para qualquer tipo de literal inteiro.
Keith Thompson
7
Estou bastante confiante de que @ 0xc0de sabe que 09não é um número octal. O que foi dito foi: " Por essa lógica , 09é um número octal". A implicação é que, como não09 é um número octal, a lógica deve estar errada.
TRiG 30/10