Doutes dans un code à l'aide do while
Question
Ceci est un petit morceau de code ci-dessous qui utilise do while. Je ne comprends vraiment le comportement inattendu que je vois quand j'exécuter ce code code.This ci-dessous utilise un état de faire en boucle et de ma connaissance a faire en boucles de telle exécute manière que si première exécute l'instruction et vérifie ensuite dans le tout partie si la condition est vraie ou not.But quand j'exécute ce code, il ne sort jamais de la boucle et se poursuit tout le monde forever.Can s'il vous plaît me dire pourquoi est-il passe?
unsigned int A = 5;
int B = 0;
main()
{
do
{
A = A + 5;
B = B - 1;
}while(B > A);
printf("hello\n");
}
Maintenant, je ne me le "bonjour" imprimé.
Merci d'avance Maddy
La solution
affiche « bonjour » pour moi. prend un certain temps (bien, une ou deux secondes).
modifié à cette ...
void main()
{
unsigned int A = 5;
unsigned int loop = 0;
int B = 0;
do
{
A = A + 5;
B = B - 1;
loop++;
}while(B > A);
printf("hello %d %d %d\n", B, A, loop);
}
imprime: -
hello -715827882 -715827881 715827882
Autres conseils
Comme les autres réponses disent, en comparant une valeur signée et non signée est une mauvaise idée (GCC en avertit si on leur donne les drapeaux à droite). La raison pour laquelle vous êtes coincé dans une « boucle infinie » est la valeur signée B
est considérée comme non signé dans le but de la comparaison. La première fois que vous arrivez à while(B > A)
, B
est -1 (il a commencé à 0 et a été décrémenté une fois). Lorsqu'ils sont traités comme non signé, il devient le plus grand entier possible, de sorte que la comparaison est vraie. Il reste pendant longtemps, de sorte que la boucle semble jamais finir. Finalement incrémenter et décrémenter A
B
les ferait passer l'autre et la boucle se terminerait, mais il faudra plus que vous aviez prévu
Vous comparez un entier non signé à un numéro de négatif. Essayez de mettre A en entier signé.
Comparant signé et non signé peut conduire à confondre le comportement. Vous devriez faire à la fois A
et B
du même type.
Vous comparez signé avec non signé. Mais vous verrez « bonjour » par la suite. A et B seront tous deux trop-plein pour faire B> Un faux.