%d avec Long Int
Est le code suivant Correcte?Aussi loin que ma compréhension,il ne devrait pas fonctionner correctement,mais sur le Dev-C++ Compilateur,il n'.Quelqu'un pourrait-il expliquer en détail s'il vous plaît?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
Grâce
Vous devriez
Ne pas utiliser le compilateur qui vient avec Dev-C++ - il est extrêmement dépassée! Voir jasonbadams.net/20081218/why-you-shouldnt-use-dev-c
scanf
pour un %ld
si c'est ce que vous attendez. Mais depuis un long
est plus grand que votre typique int
, il n'y a pas de problème avec cela.Ne pas utiliser le compilateur qui vient avec Dev-C++ - il est extrêmement dépassée! Voir jasonbadams.net/20081218/why-you-shouldnt-use-dev-c
OriginalL'auteur nikel | 2012-04-26
Vous devez vous connecter pour publier un commentaire.
Comme la plupart des choses que la bibliothèque standard C vous dit de ne pas le faire, il invoque un comportement indéfini. Indéfini signifie qu'il peut fonctionner dans certaines conditions encore bloquer lorsque vous y attendez le moins.
Dans ce cas, il fonctionne parce que
long int
etint
sont en fait la même représentation numérique: quatre octets, en complément à deux. Avec une autre plate-forme (par exemple x86-64 Linux), qui pourrait ne pas être le cas, et vous seriez probablement voir une sorte de problème. En particulier, la haute-ordre des octets de l'octet de 8long int
serait de gauche non initialisée.EDIT: Demandant "mais il crash" est la pensée de la mauvaise façon. Simplement la lecture non initialisée octets dans une variable de type
long int
est autorisé à crash d'un programme C, selon la norme du langage. Nous n'avons pas besoin de trouver un exemple d'une plate-forme qui n'a donc, pour comprendre que le programme est mal spécifié. C'est le point. C ne pas jeter le livret de règles à vous tout de suite, il attend jusqu'à ce que vous port et de briser les hypothèses de départ.Y aurait-il vraiment un problème? Je veux dire, le nombre ne représentent ce que nous voulons, mais ce ne sera pas causer la panne du programme, en quelque sorte, non? Un sujet de 64 bits, le seul vrai type entier de 64 bits est longue de longue, qui a été introduit dans le C99 et fait partie du C++11.
Procédure pour exécuter un programme avec non initialisée ou des valeurs inattendues est susceptible de causer un accident, bien que je n'ai jamais mentionné un crash, j'ai dit "certains type de problème." Habituellement, nous voulons éviter de tous mauvais comportement, et pas seulement les accidents. Sur Mac OS et Linux,
long
etlong long
sont à la fois 64 bits; je ne savais pas que Windows fait les choses autrement, mais ça ne change rien.OriginalL'auteur Potatoswatter
Comme de la Rage dit, vous devriez vraiment utiliser %ld dans le
scanf()
appel. La raison pour laquelle cela fonctionne est parce que sur votre système (ou alors il me semble),int
etlong int
sont de la même taille (probablement 4), de sortescanf()
ne pas écraser la mémoire, elle ne devrait pas.OriginalL'auteur Randall Cook
Généralement sur les systèmes 32 bit long int de 32 bits (comme int) et sur les systèmes 64 bits du système à long int 64 bits (même en tant que long long int). Si vous voulez que votre code soit portable, utiliser scanf "%ld".
OriginalL'auteur fbafelipe