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
.
É 0
um 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.
Respostas:
Sim,
0
é um literal octal em C ++.Conforme o padrão C ++:
2.14.2 Literais inteiros [lex.icon]
fonte
octal-literal
edecimal-literal
o padrão de bytes, escolhaoctal-literal
. A redação do padrão oficial não apresenta esse problema.ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate
.1
ainda sendo octal e tudo; PERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
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ão
0x
é prefixado com . é um prefixo explicitamente diferente. Aparentemente, existem pessoas que não podem fazer essa distinção.0
0x
Conforme esse mesmo padrão, se continuarmos:
fonte
0x
não é um token. Um literal inteiro começando com0x
é um único token.0x
nã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.)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.
fonte
09
não é um número octal, porque não é um número; não corresponde à sintaxe para qualquer tipo de literal inteiro.09
nã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.