2010-11-06 12 views
18

Was bedeuten "-1L", "1L" usw. in C?Was ist "-1L" in C?

Zum Beispiel in ftell Referenz, sagt sie

... Wenn ein Fehler auftritt, -1L zurückgegeben ...

Was bedeutet das? Was ist der Typ von "1L"?

Warum nicht NULL zurückgeben, wenn ein Fehler auftritt?

Antwort

39

Die L gibt an, dass die Nummer eine long Typ ist, so ist ein -1Llong Set negativ und 1L ist ein long Satz positiv.

Was, warum ftell nicht nur NULL zurückkehren, es ist, weil NULL für Zeiger verwendet wird und hier ein long zurückgegeben. Beachten Sie, dass 0 nicht verwendet wird, da 0 ein gültiger Wert für ftell ist, der zurückgegeben werden soll.

diese Situation Fangen beinhaltet einen nicht-negativen Wert Überprüfung:

long size; 
FILE *pFile; 

... 

size = ftell(pFile); 
if(size > -1L){ 
    // size is a valid value 
}else{ 
    // error occurred 
} 
+0

Ok, ich habe es. Wie bekomme ich dann die Situation, in der ftell -1L zurückgibt? --- if (ftell (fp) == -1L) {}? oder wenn (ftell (fp) == -1) {}? – bogatyrjov

+0

@Jevgeni, bearbeitet, um Ihnen ein Beispiel zu geben –

+0

Also, wenn L lang darstellt, welche Zeichen repräsentieren andere Typen? Gibt es eine verwandte Referenz im Netz? – bogatyrjov

4

Es bedeutet, den Wert als long, nicht als int zurückzugeben.

2

Das bedeutet -1 als lang (statt der Standardtyp für Zahlen, die eine ganze Zahl)

+3

'long' * ist * ein Integer-Typ. Ich denke, Sie meinen, dass der Standardtyp für Ganzzahl * Konstanten * "Int" ist - aber auch das ist eine Vereinfachung. –

2

-1 formatiertem in long int ist ein -1L. Warum nicht einfach NULL? Weil NULL in dieser Funktion ein normales Ergebnis ist und Fehler auch nicht syngnalisieren kann. Warum ist NULL in dieser Funktion ein normales Ergebnis? Da NULL == 0 und ftell die Position in einem Stream zurückgibt, wenn Sie am Anfang der Streamfunktion sind, gibt 0 zurück. Dies ist ein normales Ergebnis und kein Fehler. Wenn Sie diese Funktion mit NULL vergleichen, wird der Fehler angezeigt auf Startposition im Stream.

+1

Nein, 'NULL' ist kein normales Ergebnis für' ftell'. Die 'ftell'-Funktion gibt ein' long' zurück, keinen Zeiger. –

6

ftell() zurückkehrt Typ long int , das Suffix L an ein Literal seine Kräfte Typ lange angewendet anstatt Ebene int.

NULL wäre völlig falsch sein, weil es ein Makro repräsentiert einen Zeiger kein integer. Sein Wert kann, wenn er interpretiert wird, und eine ganze Zahl eine gültige Dateiposition darstellen, während -1 (oder irgendein negativer Wert) dies nicht kann.

Für alle Absichten und Zwecke können Sie die Fehler Rückkehr als -1 im Allgemeinen einfach betrachten, ist der L-Suffix nicht kritisch Betrieb in den meisten Fällen zu korrigieren aufgrund impliziter Casting Regeln

+0

+1 für die einzige Person, die den Unterschied zwischen Zeigern und Ganzzahlen zu kennen scheint. –

+1

Das Konvertieren eines Null-Zeigers in eine Ganzzahl führt * nicht unbedingt * zu "0". –

+0

NULL steht NICHT für einen Zeiger, es ist definiert als 0, 0L oder 0ULL, usw. Deshalb hat C++ 11 nullptr eingeführt. Betrachte: 'int foo (const char *); int foo (vorzeichenloses langes f); ... foo (NULL); '. Das wird nicht den erwarteten Wert annehmen, wenn Sie denken, dass "NULL" ein Zeigertyp ist. – kfsone

1

Schnitt heute mehr Details impliziert noch erwünscht sind .

Mark hat es richtig gemacht. Das Suffix "L" ist lang. -1L ist also eine lange -1.

Meine bevorzugte Art und Weise zu testen, unterscheidet sich von Marks und ist eine Frage der Präferenz nicht Güte.

if (err >= 0L) 
    success 
else 
    error

Nach allgemeiner Gewohnheit mag ich nicht nach expliziten -1 suchen. Wenn ein -2 jemals in der Zukunft erscheint, wird mein Code wahrscheinlich nicht brechen.

Seit ich C benutze, habe ich am Anfang von C bemerkt, dass die meisten Bibliotheksroutinen int Werte 0 für Erfolg und -1 für Fehler zurückgegeben haben. Die meisten.

NULL wird normalerweise nicht durch ganzzahlige Funktionen zurückgegeben als NULL ein Zeigerwert ist. Neben dem Aufeinanderprallen von Typen hängt ein großer Grund dafür, NULL nicht zurückzugeben, von etwas Geschichte ab.

Die Dinge waren nicht sauber zurück, als C erfunden wurde, und vielleicht nicht einmal auf kleine heute Systeme. Das Original K & R C garantierte nicht, dass NULL Null wäre, wie es normalerweise bei CPUs mit virtuellem Speicher der Fall ist. Auf kleinen "realen Speicher" -Systemen kann die Null eine gültige Adresse sein, die es notwendig macht, dass "ungültige" Adressen zu einem anderen vom Betriebssystem abhängigen Ort bewegt werden. Solch würde wirklich von der CPU akzeptiert werden, nur nicht im normalen Schema der Dinge generiert. Vielleicht eine sehr hohe Speicheradresse. Ich kann sogar ein verstecktes Array namens extern const long NULL[1]; sehen, das erlaubt, dass NULL die Adresse dieses ansonsten unbenutzten Arrays wird.

Damals sahen Sie eine Menge von if (ptr != NULL) Anweisungen anstelle von if (ptr) für Leute, die ernsthaft über das Schreiben von tragbarem Code sind.

+0

C * still * garantiert nicht, dass ein Nullzeiger die gleiche Darstellung wie Null hat.Was es garantiert, ist, dass ein ganzzahliger Konstantenausdruck mit dem Wert Null oder ein solcher Ausdruck, der in "void *" umgewandelt wurde, eine Nullzeigerkonstante ist Zeit wird eine solche Konstante in einen Null-Zeiger umgewandelt - welche Darstellung auch immer das hat. Empfohlenes Lesen: Abschnitt 5 der [comp.lang.c FAQ] (http://www.c-faq.com/) persönlich schreibe ich noch 'if (ptr! = NULL)' ra ther als 'if (ptr)' - nicht für die Portabilität, aber für die Klarheit. –

+0

Einverstanden. Das tue ich auch, es sei denn, ich schreibe für eine POSIX-Umgebung, in der der gesamte vorhandene Code nicht vorhanden ist. Dann folge ich der etablierten Konvention. – Gilbert