2016-09-27 3 views
0

Wie gesagt in den Kommentaren auf die Antwort auf diese Frage: Why gcc does not produce type mismatch warning for int and char?Warum EOF mit gültigem char-Wert übereinstimmt?

beide -1 und 255 0xFF als 8-Bit-HEX-Zahl auf alle aktuellen CPU sind.

Aber EOF ist gleich -1. Dies ist ein Widerspruch, da der Wert von EOF nicht mit einem gültigen 8-Bit-Zeichen übereinstimmen darf. Dieses Beispiel demonstriert es:

#include <stdio.h> 
int main(void) 
{ 
    char c = 255; 
    if (c == EOF) printf("oops\n"); 
    return 0; 
} 

Auf meinem Computer druckt es oops.

Wie kann dieser Widerspruch erklärt werden?

+0

'EOF' ist kein Zeichen, sondern ein Zustand. Vergleiche es mit einem "char" macht keinen Sinn. – alk

+0

Hinweis: Versuchen Sie 'unsigned char'. –

+0

"* Der Wert von EOF darf nicht mit einem gültigen 8-Bit-Zeichen übereinstimmen. *" Warum nicht? Denke nochmal nach. – alk

Antwort

2

Wenn Sie einen int Wert auf einen char Wert vergleichen, der char Wert promoted zu einem int Wert. Diese Heraufstufung ist automatisch und Teil der C-Sprachspezifikation (siehe z. B. this "Usual arithmetic conversions" reference, insbesondere Punkt 4). Sicher könnte der Compiler eine Warnung darüber geben, aber warum sollte es, wenn es ein gültiges Sprachkonstrukt ist?

Es gibt auch das Problem mit der Signedness von char, die Implementierung definiert ist. Wenn char nicht signiert ist, ist Ihre Bedingung falsch.

Auch wenn Sie gerade über jede Referenz für Funktionen Zeichen von Dateien (beispielsweise this one for fgetc and getc) lesen lesen, werden Sie sehen, dass sie ein int und keine char, genau aus den oben genannten Gründen zurück.

+0

Wenn es ein gültiges Konstrukt ist, dann stellt sich heraus, dass EOF zu einem gültigen Zeichenbereich gehört, was nicht möglich ist.Char und int * können nicht den gleichen Wert * haben, selbst wenn es sich um versteckte Werbung handelt. Wenn zum Beispiel EOF 65535 ist, würde der Compiler eine Warnung ausgeben. Aus welchen Gründen ist EOF "-1"? –

+0

@IgorLiferenko * Warum * können ein 'int' und ein' char' nicht denselben Wert haben? Nehmen wir zum Beispiel den Wert '97'. Egal, ob es in einem 'char', einem' short', einem 'int' oder sogar einem' long long' gespeichert ist, es wird als '97' gespeichert, mit den Bits' 01100001'. Mehrere Typen, gleicher Wert, genau gleich gespeichert. Dass der Wert '97' auch zufällig der ASCII-Code für''' ist, spielt keine Rolle, er wird immer noch als '97' gespeichert. –

+0

Statt "kann nicht" wollte ich sagen "muss nicht". Wie auch immer, wenn "EOF" zu "INT_MAX" gemacht wurde, wäre alles perfekt. Offensichtlich war es eine Dummheit, es "-1" zu machen. –