2012-02-23 8 views
18

Deve un'implementazione C++ impostare i chars '0' - '9' di avere valori numerici contigui, vale a dire in modo che:Le cifre dei caratteri ['0' .. '9'] sono necessarie per avere valori numerici contigui?

'0' -> 0+n 
'1' -> 1+n 
m -> m+n 
'9' -> 9+n 

io non riesco a trovarlo menzionato nella documentazione di isdigit ([classificazione] (22.3. 3.1 Classificazione dei caratteri)) *, né posso trovarlo nella documentazione locale (ma forse non sembravo abbastanza difficile).

In 2.3 Set di caratteri, troviamo che

L'insieme dei caratteri fonte di base consiste di 96 caratteri: il carattere di spazio, i caratteri di controllo rappresentano scheda orizzontale, scheda verticale, mangimi forma, e di nuova riga , oltre ai seguenti 91 caratteri grafici

Ma non menziona alcun ordinamento (ma forse non mi sembra abbastanza difficile).


*: nota interessante c'è:

Quando utilizzato in un ciclo, è più veloce per memorizzare nella cache il ctype <> sfaccettatura e utilizzarlo direttamente [invece di isdigit() et al, fine commento], o utilizzare il modulo vettoriale di ctype <> :: is.

+9

Perché il voto per la chiusura: "Questa domanda non è adatta al nostro formato di domande e risposte. Ci aspettiamo che le risposte coinvolgano generalmente fatti, riferimenti o competenze specifiche; questa domanda richiederà probabilmente opinioni, dibattiti, discussioni, sondaggi o discussioni estese. Ho fatti, riferimenti, competenze specifiche e la risposta probabilmente non coinvolgerà l'opinione, il dibattito, l'argomentazione, il sondaggio, ma prorogherà un riferimento nello standard quindi nessuna discussione estesa? Qualcuno ha un alto potere mod? –

+0

Non è nella roba locale, perché deve occuparsi anche di altre cifre. (Ad esempio 'Ⅿ';)) – MSalters

risposta

22

In effetti non sembrava abbastanza difficile: in 2.3. insiemi di caratteri, articolo 3:

In entrambe le sorgenti ed esecuzione set di caratteri di base, il valore di ogni carattere dopo 0 nella sopra elenco di cifre decimali sono uno maggiore il valore di il precedente.

e questo è possibile che questo elenco di cifre decimali:

0 1 2 3 4 5 6 7 8 9 

Pertanto, un'implementazione deve utilizzare un set di caratteri in cui le cifre decimali hanno una rappresentazione contigui. Pertanto, le ottimizzazioni su cui si basa questa proprietà sono sicure; tuttavia, le ottimizzazioni in cui ci si basa sulla coniguità di altre cifre (ad esempio 'a' .. 'z') sono non portatile w.r.t. allo standard (vedi anche intestazione <cctype>). Se lo fai, assicurati di asserire quella proprietà.

+0

Grazie a @cHao per il suggerimento. Stupefacente. –

+1

Come accade, sia ASCII (e le sue derivate) che EBCDIC assegnano valori contigui alle cifre decimali. ASCII rende le lettere minuscole contigue, così come le lettere maiuscole; EBCDIC no. Questo è probabilmente il motivo per cui C e C++ richiedono cifre consecutive, ma non lettere consecutive. La stragrande maggioranza delle implementazioni C++ utilizza ASCII o uno dei suoi derivati ​​(Latin-1, Windows-1252, Unicode, ecc.); la stragrande maggioranza degli altri usa EBCDIC. –

+0

penso che questo dovrebbe essere accettato come risposta e chiuso! –

Problemi correlati