2015-05-05 8 views
160

In una libreria personalizzata vidi un'implementazione:Perché l'alfabeto è diviso in più intervalli in questo codice C?

inline int is_upper_alpha(char chValue) 
{ 
    if (((chValue >= 'A') && (chValue <= 'I')) || 
     ((chValue >= 'J') && (chValue <= 'R')) || 
     ((chValue >= 'S') && (chValue <= 'Z'))) 
     return 1; 
    return 0; 
} 

è che un Easter egg o quali sono i vantaggi vs metodo standard C/C++?

inline int is_upper_alpha(char chValue) 
{ 
    return ((chValue >= 'A') && (chValue <= 'Z')); 
} 
+0

Nota che in EBCDIC, l'intervallo di caratteri per lettere minuscole viene prima dell'intervallo di caratteri per lettere maiuscole, ed entrambi precedono le cifre, che è esattamente l'opposto dell'ordine in codifiche basate su ASCII (come la serie 8859-x, o Unicode, o CP1252, o ...). –

+1

Nota: se ''J' - 'I'' e'' S '-' R'' sono entrambi '1', allora mi aspetto che un ragionevole ottimizzatore trasformi il primo in quest'ultimo. –

risposta

215

L'autore di questo codice aveva presumibilmente per sostenere EBCDIC ad un certo punto, in cui i valori numerici delle lettere sono non contigua (esistono spazi tra I, J e R, S, come si può immaginare) .

Vale la pena notare che gli standard C e C++ garantiscono solo che i caratteri da 0 a 9 contengano valori numerici contigui proprio per questo motivo, quindi nessuno di questi metodi è strettamente conforme allo standard.

+1

Sì, questo è sicuro che l'autore desidera supportare il codice 037 EBCDIC. per verificare i codici EBCDIC, fai riferimento al link http://en.wikipedia.org/wiki/EBCDIC_037 –

+1

Sì, hai ragione. Il metodo è implementato per le lettere non contigue in EBCDIC. Grazie per la risposta! –

+64

Il vero WTF è il motivo per cui l'autore originale non ha inserito un commento: // Nella codifica EBCDIC, l'alfabeto presenta degli spazi tra questi valori. Vedi URL: xxxx per i dettagli'. Allora non avresti mai nemmeno dovuto fare la domanda. Avresti la risposta incorporata nel codice. – abelenky

54

Sembra che tenti di coprire sia EBCDIC che ASCII. Il vostro metodo alternativo non funziona per EBCDIC (che ha i falsi positivi, ma senza falsi negativi)

C e C++ farlo richiedono che '0'-'9' contigue.

Si noti che la libreria standard chiama do sa se funzionano su ASCII, EBCDIC o altri sistemi, quindi sono più portatili e possibilmente più efficienti.

+5

'std :: isupper' interroga effettivamente la locale C globale attualmente installata. – Lingxi

+1

Sì, hai ragione. Il metodo è scritto per coprire entrambe le codifiche. Grazie per la risposta! –

+4

@Lingxi: vero, ma ciò non significa che è possibile cambiare la locale da ASCII a EBCDIC. "A" deve rimanere "A" a prescindere dal locale. ASCII in UTF-8, sarebbe possibile. – MSalters

Problemi correlati