it-swarm.com.de

Speichern des Zeichens EOF (Date of End)) in einem Zeichentyp

Ich habe in Dennis Ritchies The C Programming Language Buch gelesen, dass int verwendet werden muss, damit eine Variable EOF - enthält), damit sie ausreichend groß ist dass es EOF value - not char halten kann. Aber der folgende Code funktioniert gut:

#include<stdio.h> 

main()  { 
  char c; 
  c=getchar(); 
  while(c!=EOF)  { 
    putchar(c); 
    c=getchar(); 
  } 
} 

Wenn keine Eingabe mehr erfolgt, gibt getchar EOF zurück. Und im obigen Programm kann die Variable c mit dem Typ char es erfolgreich halten.

Warum funktioniert das? Gemäß der Erklärung in dem oben erwähnten Buch sollte der Code nicht funktionieren.

11
user1369975

Ihr Code scheint zu funktionieren, da die impliziten Typkonvertierungen versehentlich das Richtige bewirken.

getchar() gibt ein int mit einem Wert zurück, der entweder in den Bereich von unsigned char passt oder EOF ist (was negativ sein muss, normalerweise ist es -1) . Beachten Sie, dass EOF selbst kein Zeichen ist, sondern ein Signal, dass keine weiteren Zeichen verfügbar sind.

Beim Speichern des Ergebnisses von getchar() in c gibt es zwei Möglichkeiten. Entweder kann der Typ char den Wert darstellen. In diesem Fall ist dies der Wert von c. Oder der Typ charkann nicht den Wert darstellen. In diesem Fall ist nicht definiert, was passieren wird. Intel-Prozessoren hacken nur die hohen Bits ab, die nicht in den neuen Typ passen (wodurch der Wert modulo 256 für char effektiv reduziert wird), aber darauf sollten Sie sich nicht verlassen.

Der nächste Schritt besteht darin, c mit EOF zu vergleichen. Da EOF ein int ist, wird c ebenfalls in ein int konvertiert, wobei der in c gespeicherte Wert beibehalten wird. Wenn c den Wert von EOF speichern könnte, ist der Vergleich erfolgreich, aber wenn cnicht den Wert speichern könnte, wird der Vergleich scheitern, weil beim Konvertieren von EOF in den Typ char ein unwiederbringlicher Informationsverlust aufgetreten ist.

Es scheint, dass Ihr Compiler den Typ char signiert und den Wert von EOF so klein gemacht hat, dass er in char passt. Wenn char nicht signiert wäre (oder wenn Sie unsigned char Verwendet hätten), wäre Ihr Test fehlgeschlagen, da unsigned char Den Wert von EOF nicht enthalten kann.


Beachten Sie auch, dass es ein zweites Problem mit Ihrem Code gibt. Da EOF selbst kein Zeichen ist, Sie es jedoch in einen char -Typ zwingen, gibt es sehr wahrscheinlich ein Zeichen, das als EOF und für die Hälfte des Zeichens falsch interpretiert wird Mögliche Zeichen ist undefiniert, ob sie korrekt verarbeitet werden.