2012-04-14 15 views
1

Dies ist ein Beispielcode aus Die C-Programmiersprache von Ritchie & Kernighan.Return-Zeichen

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

Beachten Sie, dass referes auf eine Variable des Typs int putchar. Warum ist es möglich, mit diesem Code sowohl Zeichen als auch Ganzzahlen anzuzeigen und anzuzeigen?

Antwort

4

Ein int wird normalerweise von 4 Bytes dargestellt, während ein char eigentlich nur 1 Byte Daten ist. Sie können einfach ein vollständiges Zeichen und mehr in der einzelnen int speichern, die getchar() zurückgibt. Wenn ein int an putchar(int) übergeben wird, wird das zusätzliche Leerzeichen einfach weggespielt, bevor es angezeigt wird. Diese Technik ist nützlich für die Übergabe EOF, die eigentlich überhaupt kein char ist, sondern eine int, die das Ende der Datei signalisiert.

+0

Beachten Sie, dass der Grund int anstelle von char verwendet wird, weil das System in der Lage sein muss, EOF zu signalisieren - und dazu einen speziellen Rückgabewert, -1 (der der EOF-Konstante entspricht) verwendet. Da dieses -1 nicht in das char passt, wird das Ergebnis von getchar() stattdessen als int gespeichert. – mfrankli

+0

Der Wortlaut klingt wie ein int ist in der Regel 4 Bytes (wahr) und ein Zeichen ist in der Regel 1 Byte (nicht genau, weil ein Zeichen ist * immer * 1 Byte). Trotzdem +1 für eine gute Antwort. –

+0

@mfrankli: Sie * können * -1 in ein 'char' setzen, wenn der' char' Typ der Implementierung signiert ist, was viele sind, und die Konvertierungsregeln erlauben '-1', in' char' Typ konvertiert zu werden, wenn dies der Fall ist unterzeichnet. Der Grund dafür, dass 'getchar'' int' zurückgibt, ist, dass es * immer * signiert ist und 'EOF' als irgendeine negative Zahl definiert ist (nicht notwendigerweise -1, ist es aber normalerweise). – dreamlax

1

Der Typ char ist nichts anderes als eine Ganzzahl, die in den meisten Fällen nur ein 8-Bit-Byte ist. Der Typ int ist eine Ganzzahl, die normalerweise breiter ist und so alle möglichen Werte behalten kann, die ein Zeichen behalten kann. Um die Überprüfung funktionieren zu lassen, muss sie sizeof(int) > sizeof(char) enthalten. Fast immer ist es so. Aber wenn ich mich gut erinnere, wird gesagt, dass der Standard dies nicht vorschreibt; es bedeutet, dass der einzige portable und sichere Weg, um zu überprüfen, ob der bereits gelesene EOF ein echtes Ende der Datei ist oder nicht, es ist mit feof(FILE *) zu überprüfen. (Z. B. wenn auf Ihrem System CHAR_BIT 16 ist, sizeof (char) == 1 per Definition, aber sizeof (int) könnte auch 1 sein).

+0

Der Standard garantiert nur 'sizeof (lang)> = sizeof (int)> = sizeof (kurz)> = sizeof (char)' und ich kenne einige DSP (von TI) habe 'CHAR_BIT == 32' und' sizeof (long) = 1' –

+0

obwohl, ich wage, auf diesen Maschinen, was Sie die meiste Zeit tun, ist nicht Datei-I/O, das ein Char pro Zeit auswählt; So arbeiten wir täglich an gewöhnlichen Maschinen, es ist kein Problem; aber es ist natürlich erwähnenswert. – ShinTakezou

1

getchar() kehrt int, so dass er zuverlässig halten den EOF Wert (die jede negative ganze Zahl zu sein, definiert ist, und in den meisten Implementierungen ist es -1). Der Typ char kann abhängig von der Implementierung signiert oder nicht signiert sein. Wenn es signiert ist, dann kann in der Lage sein, den EOF Wert zu halten, vorausgesetzt, dass EOF Typ innerhalb des Bereichs von signed char Typ ist, und wenn es vorzeichenlos ist, dann kann es nicht von einem tatsächlichen Zeichenwert abweichen, wenn EOF konvertiert wird unsigned char Typ.

+0

Ich glaube, 'getchar' gibt einen int zurück, weil diese Funktion existierte, bevor K & R der Sprache Funktionsprototypen hinzufügte. Zu dieser Zeit gaben * alle * Funktionen einen int zurück. Sie haben dann diese Tatsache benutzt, um den EOF-Wert zu komprimieren. –