In C sind Zeichenfolgen Arrays von Zeichen (char *
) und Zeichen werden normalerweise in char
gespeichert. Ich habe bemerkt, dass einige Funktionen von der libC als Argument ganze Zahlen anstelle von einem Zeichen nehmen. B. die Funktionen toupper()
und , die beide int
verwenden. Der Mann Seite sagt:Warum putchar, toupper, tolower, etc. einen Int anstelle eines Chars nehmen?
Wenn c nicht ein unsigned char Wert ist, oder EOF, das Verhalten dieser Funktionen ist nicht definiert.
Meine Vermutung ist, dass mit einem int
, toupper
und tolower
sind in der Lage mit unsigned char
und EOF
zu beschäftigen. Aber in der Tat EOF
ist in der Praxis (gibt es eine Regel über seinen Wert?) Ein Wert, der mit einer char
gespeichert werden kann, und da diese Funktionen EOF
in etwas anderes nicht transformieren, frage ich mich, warum toupper
nicht einfach nehmen ein Zeichen als Argument.
In jedem Fall müssen wir etwas akzeptieren, das kein Zeichen (wie EOF) ist? Könnte mir jemand einen relevanten Anwendungsfall zur Verfügung stellen?
Dies ist vergleichbar mit fputc
oder putchar
, die auch eine int
nehmen, die ohnehin in eine unsigned char
umgewandelt wird.
Ich bin auf der Suche nach den genauen Motivationen für diese Wahl. Ich will überzeugt werden, ich will nicht antworten, dass ich nicht weiß, ob mich jemand eines Tages fragt.
Ich kenne keine Regel, dass 'EOF' in eine' char' passen muss, und ich kann Ihnen versichern, dass 'char' nicht unterzeichnet werden garantiert, die über die Verwendung von' char' Ihre Diskussion macht statt von "unsigned char" scheint der falsche zu sein. Du meinst "signed char". –
Haben Sie sich die Implementierungen dieser Funktionen angeschaut? Ich denke, 'int' Parameter ist für Optimierungszwecke, weil seine Byte-Größe gut zu Größen der Prozessorregister passt. Eine Byte- "char" -Variable muss wiederum hinter dem Vorhang in "int" umgewandelt werden, und diese Operation benötigt eine gewisse Prozessorzeit für die Verarbeitung. – sgnsajgon
Lesen Sie dies: [Definition von EOF und wie man es effektiv verwendet] (http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284351&answer=1048865140) –