In einer benutzerdefinierten Bibliothek habe ich eine Implementierung gesehen:
inline int is_upper_alpha(char chValue)
{
if (((chValue >= 'A') && (chValue <= 'I')) ||
((chValue >= 'J') && (chValue <= 'R')) ||
((chValue >= 'S') && (chValue <= 'Z')))
return 1;
return 0;
}
Ist das ein Osterei oder was sind die Vorteile gegenüber der Standard-C / C ++ - Methode?
inline int is_upper_alpha(char chValue)
{
return ((chValue >= 'A') && (chValue <= 'Z'));
}
'J' - 'I'
und'S' - 'R'
beide gleich sind1
, erwarte ich, dass ein vernünftiger Optimierer den ersteren in den letzteren umwandelt.Antworten:
Der Autor dieses Code vermutlich hatte zu unterstützen EBCDIC an einem gewissen Punkt, wo die numerischen Werte der Buchstaben sind nicht zusammenhängende (Lücken bestehen zwischen
I
,J
undR
,S
wie Sie vielleicht schon erraten haben).Es ist erwähnenswert, dass die C- und C ++ Standards nur garantiert werden, dass die Zeichen
0
auf9
genau aus diesem Grunde zusammenhängende numerische Werte, also keines dieser Verfahren streng normgerechten sind.quelle
// In the EBCDIC coding, the alphabet has gaps between these values. See URL: xxxx for details
. Dann müssten Sie nie einmal die Frage stellen. Sie hätten die Antwort in den Code integriert.return ( isalpha( chValue ) && isupper( chValue ) )
...Es scheint, als würde versucht, sowohl EBCDIC als auch ASCII abzudecken. Ihre alternative Methode funktioniert nicht für EBCDIC (sie hat falsch positive, aber keine falsch negativen Ergebnisse).
C und C ++ Sie verlangen , dass
'0'-'9'
angrenzen.Beachten Sie, dass die Standard - Bibliothek Anrufe Sie wissen , ob sie auf ASCII laufen, EBCDIC oder anderen Systemen, so dass sie mehr tragbar und möglicherweise effizienter sind.
quelle
std::isupper
fragt tatsächlich das aktuell installierte globale C-Gebietsschema ab.'A'
muss'A'
unabhängig vom Gebietsschema bleiben . ASCII zu UTF-8, das wäre möglich.std::isupper
das aktuell installierte globale C-Gebietsschema ab, ja, die Kompilierungsphase, in der Zeichenliterale interpretiert werden, jedoch nicht.std::isupper
in den meisten Fällen wirklich benötigt wird. Es berücksichtigt Gebietsschemas, die für die Eingabe durch den Benutzer verwendet werden. Wenn Sie jedoch Dateien analysieren und mit Datenbanken interagieren, erwarten Sie normalerweise ein anderes Gebietsschema. Darüber hinaus sind diese Aufrufe im Zusammenhang mit dem Gebietsschema zumindest unter Linux sehr langsam.std::isalpha
Rufen Sie beispielsweise dynamic_cast zweimal auf, um die richtige Implementierung des Gebietsschemas zu "finden", bevor Sie tatsächlich ein einzelnes Zeichen vergleichen.