2015-09-14 12 views
7

C++ 14 ha introdotto il concetto di separatori di cifre in letterali, sulla falsariga di 3'141'592'653'589. Ora questa è una grande funzionalità per codice leggibile, ma mi chiedevo se consentiva di virgolette prima dello la porzione numerica di un letterale di tipo 0x/0b. Mi sembra che:I separatori di cifre sono consentiti prima delle cifre in un numero esadecimale o binario?

unsigned int topThreeBits = 0b'1110'0000; 
unsigned int hexNum  = 0x'dead'beef; 

è più leggibile di quella senza un separatore leader:

unsigned int topThreeBits = 0b1110'0000; 
unsigned int hexNum  = 0xdead'beef; 

perché delinea chiaramente la base dalle cifre.

Dal momento che non ho ancora un compilatore C++ 14, ho bisogno di confermare in un modo o nell'altro se consentire ciò.

So che non ha senso per numeri non prefissati come '123'456, soprattutto perché il parser non saprebbe se doveva essere una variabile char o un valore letterale numerico.

Ma, per letterali prefissati, non posso vedere c'è qualche confusione su ciò che il token è destinato a essere al primo punto ' arriva - il 0x/0b ha già dettata sarà un letterale numerico.

+0

Mi sono chiesto lo stesso. Come dice la risposta, non può essere fatto (ancora?). Quindi per ottenere numeri simmetrici/stuzzichini/ecc., Dobbiamo accontentarci della prossima cosa migliore: '0b0'1110'0000' ([hmm] (https://sites.google.com/site/ohmusicstudent/_/rsrc/ 1315398151002/band-instruments/oboe/oboe-history/oboe2.gif)) e '0x0'dead'beef' ([omg] (http://londonpride.com/wp-content/uploads/2013/09/Oxo__Beef________4c23b399c6687. jpg)) –

+0

@underscore_d, il principale '0' è in realtà un'idea brillante, non una che avevo pensato. Lo zero iniziale non ha alcun effetto sul valore e consente comunque una "porzione di numero reale" visivamente distinta. – paxdiablo

+0

Sì, semplice ma efficace, ea volte queste cose sono facili da perdere :-) –

risposta

8

Se guardiamo la grammatica dalla sezione draft C++14 standard: N41402.14.2[lex.icon], non è consentito a destra dopo l'indicatore di base esadecimale o letterali binari:

binary-literal: 
    0b binary-digit 
    0B binary-digit 
    binary-literal ’opt binary-digit 
[...] 
hexadecimal-literal: 
    0x hexadecimal-digit 
    0X hexadecimal-digit 
    hexadecimal-literal ’opt hexadecimal-digit 

Anche se, letterali ottale fanno consentire il separatore dopo che l'indicatore di base:

octal-literal: 
    0 
    octal-literal ’opt octal-digit 

possiamo anche controllare utilizzando uno del compilatore linea che forniscono C++ 14 compilatori come Coliru o Wandbox.

Il problema del gruppo di lavoro sull'evoluzione che monitorava questa modifica era issue 27: N3781 Single-Quotation-Mark as a Digit Separator, N3661, N3499 Digit Separators, N3448 Painless Digit Separation. Non vedo una spiegazione logica per questa decisione di progettazione, forse è solo un'interpretazione letterale del separatore di cifre .

Nota è possibile trovare un elenco di standard di bozza da Where do I find the current C or C++ standard documents?.

+0

Grazie per quello. Anche i link sono carini, ho usato il codingground ma sembra solo andare a gcc 4.8.x che non è C++ 14. – paxdiablo

+0

Tranne l'indicatore di base ottale. È permesso immediatamente dopo il '0'. – hvd

+0

@hvd avrei dovuto essere più specificato, ho aggiornato la mia risposta. –

Problemi correlati