0 è un valore letterale decimale o un valore letterale ottale?


329

Lo zero è sempre zero, quindi non importa. Ma in una recente discussione con un amico ha detto che i letterali ottali sono quasi inutilizzati oggi. Poi mi sono reso conto che in realtà quasi tutti i letterali interi nel mio codice sono ottali, vale a dire 0.

È 0un ottale letterale in base al C ++ grammatica? Cosa dice lo standard?

L'unico vero utilizzo di cui sono a conoscenza è per le autorizzazioni dei file unix.


6
È lo stesso per Java?
Philippe

80
+1 per porre una domanda del tutto irrilevante e ottenere tonnellate di voti positivi :-)
Kerrek SB

64
Penso che il modo di replicare istantaneamente su SO non sia una domanda profonda, ma una domanda peculiare la cui risposta ti farà guadagnare credito geek al dispositivo di raffreddamento dell'acqua :)
Josh

4
Domanda formidabile :) L'ho cercato nelle specifiche del linguaggio Java e in Java è decimale. La specifica contiene anche la seguente citazione: Nota che i numeri ottali sono sempre composti da due o più cifre; 0 è sempre considerato un numero decimale - non che contenga molto in pratica, poiché i numeri 0, 00 e 0x0 rappresentano tutti esattamente lo stesso valore intero.
Tobias Ritzau,

14
Sono quasi tentato di pubblicare una risposta che dice "Sì, 0 è un valore letterale decimale o un valore letterale ottale".
Keith Thompson,

Risposte:


296

Sì, 0è un letterale ottale in C ++.

Secondo lo standard C ++:

2.14.2 Letterali interi [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

39
L'altro punto importante è che un decimale-letterale è una cifra diversa da zero seguita da zero o più cifre quindi non c'è ambiguità.
CB Bailey,

3
@MSalters: con la tua versione, devi specificare ulteriormente la preferenza: se entrambe octal-literal e decimal-literalsono possibili interpretazioni del modello di byte, scegli octal-literal. La formulazione dello standard ufficiale non presenta questo problema.
Martin Sojka,

23
@MSalters: non si potrebbe ancora avere un valore decimale-letterale come qualsiasi numero di cifre, dovrebbe essere un singolo zero o una cifra diversa da zero seguita da qualsiasi cifra altrimenti ogni valore letterale ottale potrebbe essere interpretato come un valore letterale decimale. Riesco a vedere l'errore di compilazione, ora: ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey,

3
@MSalters Nel tuo esempio, 0123 corrisponderebbe a entrambi i valori ottale-letterale e decimale-letterale, ma avrebbe significati diversi in entrambi i modi.
soffice

5
@CharlesBailey - FTFY, con 1ancora l'ottale e tutto; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg,

44

Qualsiasi valore intero con prefisso 0è un valore ottale. Vale a dire: 01 è 1 ottale, 010 è 10 ottale, che è 8 decimale, e 0 è 0 ottale (che è decimale e qualsiasi altro, 0).

Quindi sì, "0" è un ottale.

Questa è una semplice traduzione inglese dello snippet di grammatica nella risposta di @ Als :-)


Un numero intero con prefisso non0x è preceduto da . è un prefisso esplicitamente diverso. Apparentemente ci sono persone che non possono fare questa distinzione.00x

Secondo lo stesso standard, se continuiamo:

 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

5
"Qualsiasi valore intero che inizia con '0' è un valore ottale." Non vero. Esempio: 0xA inizia con '0' ed è un valore intero.
Nikolai Ruhe

4
0xnon è un token. Un valore letterale intero che inizia con 0xè un singolo token.
Keith Thompson,

4
Quale fonte stai citando per quella definizione? La parola "token" è definita sintatticamente dagli standard C (N1570 6.4) e C ++ (C ++ 11 2.7 [lex.token]). 0xnon si qualifica. (Almeno in C, è un numero di preelaborazione (N1570 6.4.8) se non fa parte di una costante esadecimale, ma non è un token.)
Keith Thompson,

11
Stiamo discutendo la sintassi di costanti / letterali interi come definito dagli standard C e C ++ . In che modo la definizione di "token" non è la più appropriata da utilizzare in questo contesto? La tua condiscendenza offensiva è inappropriata. E se pensi che io sia un bullo nel sottolineare qualcosa che penso sia un errore tecnico nella tua risposta, ti suggerisco di riconsiderare il significato di quella parola. (Non hai mai risposto alla mia domanda sulla fonte della tua definizione.)
Keith Thompson,

4
Se qualcuno è curioso, l'affermazione secondo cui " un token è una stringa di uno o più personaggi che è significativo come gruppo " sembra provenire da questo articolo di Wikipedia .
Keith Thompson,

-2

Apparentemente tutti i letterali interi che iniziano con zero sono in effetti ottali. Ciò significa che include anche 0. Ciò fa poca differenza poiché zero è zero. Ma non sapere questo fatto può farti del male.

Me ne sono reso conto quando stavo cercando di scrivere un programma per convertire i numeri binari in output decimale ed esidecimale. Ogni volta che stavo dando un numero che iniziava con zero, ottenevo un output errato (ad esempio, 012 = 10, non 12).

È utile conoscere queste informazioni in modo da non commettere lo stesso errore.


7
Letterali interi che iniziano con zero ma senza la 'x' dopo lo zero.
luiscubal,

5
Un'affermazione "sì" senza prove non è neanche una risposta.
Razze di leggerezza in orbita

1
Secondo questa logica, 09 è un numero ottale.
0xc0de,

3
@ 0xc0de: No, 09non è un numero ottale, perché non è affatto un numero; non corrisponde alla sintassi per nessun tipo di intero letterale.
Keith Thompson,

7
Sono abbastanza fiducioso che @ 0xc0de sappia che 09non è un numero ottale. Ciò che è stato detto era: " Secondo questa logica , 09è un numero ottale". L'implicazione è che, poiché non09 è un numero ottale, la logica deve essere errata.
TRiG
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.