%d mit Long Int
Ist der folgende code Korrekt?Soweit mein Verständnis,sollte es nicht funktionieren,aber auf der Dev-C++ - Compiler,der es tut.Könnte mir jemand im detail erklären, bitte?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
Dank
Sollten Sie
verwenden Sie nicht den compiler, der kommt mit Dev-C++ - es ist extrem veraltet! Siehe jasonbadams.net/20081218/why-you-shouldnt-use-dev-c
scanf
für eine %ld
wenn es das ist, was Sie erwarten. Aber seit ein long
ist größer als Ihre typische int
es ist kein Problem mit diesem.verwenden Sie nicht den compiler, der kommt mit Dev-C++ - es ist extrem veraltet! Siehe jasonbadams.net/20081218/why-you-shouldnt-use-dev-c
InformationsquelleAutor nikel | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie die meisten Dinge, die die standard-C-Bibliothek sagt, dass Sie nicht zu tun, ruft es zu undefiniertem Verhalten. Undefiniert bedeutet, dass es funktionieren könnte, unter bestimmten Bedingungen noch abstürzt, wenn Sie es am wenigsten erwarten.
In diesem Fall, es funktioniert, weil
long int
undint
sind eigentlich die gleichen numerischen Darstellung: vier-byte -, zwei-Komplement. Mit einer anderen Plattform (z.B. x86-64 Linux), das könnte nicht der Fall sein, und du wirst wahrscheinlich sehen, irgendeine Art von problem. Insbesondere die high-order-bytes der 8-byte -long int
wäre Links nicht initialisiert.EDIT: Frage: "aber wird es crash" denken der falsche Weg. Bloß zu Lesen uninitialisierte bytes in eine variable vom Typ
long int
darf Abstürzen, ein C-Programm, entsprechend der Sprache standard. Wir brauchen nicht zu finden, ein Beispiel für eine Plattform, die so tut, zu verstehen, dass das Programm schlecht angegeben. Das ist der Punkt. C nicht, werfen Sie das Regelbuch auf Sie sofort, es wartet, bis Sie den Hafen und brechen die ursprünglichen Annahmen.Wäre es wirklich ein problem sein? Ich meine, die Zahl nicht darstellen, was wir wollen, aber dies wird nicht dazu führen, das Programm zum Absturz in keiner Weise, Recht? Eine über-64-bit, die wahre, die einzige integer-Typ zu sein, der 64 bit lang ist lang, das wurde in C99 und ist Teil der C++11 standard.
Verfahren zum ausführen eines Programms mit nicht initialisierter oder unerwartete Werte verursachen einen Absturz, obwohl ich erwähnte nie einen Absturz; ich sagte: "irgendeine Art von problem." In der Regel wollen wir vermeiden, alle Fehlverhalten, nicht einfach abstürzt. Auf Mac OS und Linux
long
undlong long
sind beide 64 bit; ich war nicht bewusst, dass Windows hat die Dinge anders, aber es ändert sich nichts.InformationsquelleAutor Potatoswatter
Als Tobte sagt, sollten Sie wirklich %ld in der
scanf()
nennen. Der Grund, warum es funktioniert, weil auf Ihrem system (oder so scheint es mir),int
undlong int
sind die gleiche Größe (wahrscheinlich 4), soscanf()
nicht überschreiben Speicher sollte es nicht.InformationsquelleAutor Randall Cook
In der Regel auf 32-bit Systemen long int 32 bit (wie int), und auf 64-bit-system long int 64 bit (gleiche wie long long int). Wenn Sie möchten, dass Ihr code portabel, benutzen Sie scanf mit "%ld".
InformationsquelleAutor fbafelipe