Diese Frage ergibt sich aus dem Vorschlag, in ein Zeichen ohne Vorzeichen umzuwandeln char ist erforderlich, bevor Zeichenmanipulationsfunktionen wie std::toupper und std::tolower aufgerufen werden. Der Code von Bjarne Stroustrup scheint diese Funktionen jedoch ohne Umwandlung zu verwenden.
Char-Darstellung
Char, signiertes Zeichen und unsigniertes Zeichen sind unterschiedliche Typen in C . Char kann einen Bereich darstellen, der entweder einem vorzeichenbehafteten oder einem vorzeichenlosen Zeichen entspricht. In Systemen, in denen char signiert ist, hat der gesamte Zeichensatz nicht negative Werte.
toupper-Funktion
Gemäß dem C-Standard akzeptiert toupper ein int-Argument und gibt zurück ein int-Ergebnis. Der Eingabewert muss als vorzeichenloses Zeichen oder gleich EOF darstellbar sein. Wenn nicht, ist das Verhalten undefiniert.
Undefiniertes Verhalten
Wenn plain char signiert ist und der an toupper übergebene Wert negativ ist, tritt undefiniertes Verhalten auf. Dies liegt daran, dass die implizite Konvertierung in int einen negativen Wert ergibt.
Umwandlung in vorzeichenloses Zeichen
Durch die Umwandlung des char-Arguments in vorzeichenloses Zeichen wird sichergestellt, dass der Wert nicht negativ ist , um undefiniertes Verhalten zu vermeiden. Obwohl char und unsigned char die gleiche Größe haben, stellen sie unterschiedliche Wertebereiche dar.
Implementierung
Diese Funktionen werden normalerweise mithilfe von Nachschlagetabellen implementiert. Eine Indizierung über die Grenzen der Tabelle hinaus kann zu undefiniertem Verhalten führen. Die direkte Konvertierung in vorzeichenlose Zeichen vermeidet dieses Problem nicht, wenn das Ergebnis implizit zurück in einen negativen Wert konvertiert wird.
Ausnahme: EOF
Die Funktionen in
C-Modifikationen
Der C-Standard ändert nur bestimmte C-Standardbibliotheksfunktionen und Es wurden keine Anpassungen an den Funktionen vorgenommen
Fazit
Um undefiniertes Verhalten zu vermeiden, ist es notwendig, das char-Argument in unsigned char umzuwandeln, bevor toupper, tolower oder ähnliches aufgerufen wird funktioniert, auch wenn char ein nicht negativ vorzeichenbehafteter Typ ist.
Das obige ist der detaillierte Inhalt vonSollte ich in „unsigned char' umwandeln, bevor ich „toupper()', „tolower()' usw. verwende?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!