Problème très bizarre avec la boucle for (C)
Résolu/Fermé
e-proton
Messages postés
81
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
12 juin 2009
-
14 janv. 2009 à 01:58
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 - 14 janv. 2009 à 16:14
e-proton Messages postés 81 Date d'inscription jeudi 2 octobre 2008 Statut Membre Dernière intervention 12 juin 2009 - 14 janv. 2009 à 16:14
A voir également:
- Problème très bizarre avec la boucle for (C)
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Copytrans heic for windows - Télécharger - Visionnage & Diaporama
- Download instagram for pc - Télécharger - Divers Communication
- Saveaspdf.exe for office 2007 - Télécharger - Bureautique
- Idm for mac - Télécharger - Téléchargement & Transfert
5 réponses
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
14 janv. 2009 à 02:14
14 janv. 2009 à 02:14
J'ai juste regardé ton premier code. Et il n'y a aucun problème.
Première boucle for :
Tu mets la variable "a" à 0. b vaut 20.
La condition de fin de la boucle est b>10 et dans le corps on a la décrémentation de b.
La boucle aura donc 10 itérations. A la fin de la boucle b vaudra 10 (10>10 renvoie faux) et a vaudra 10.
deuxième boucle for :
Tu remets la variable "a" à 0. b vaut toujours 10.
La première condition b<10 échoue. Donc aucune itération.
La variable "a" reste donc à 0. Donc pas d'entourloupe de la part du compilateur ;)
Cdlt
#include <stdio.h> #include <stdlib.h> int main(void) { long a,b=20; for (a=0;b>10;a++) { b--; } for (a=0;b<10;a--) { b++; } printf("%ld",a); return (EXIT_SUCCESS); }
Première boucle for :
Tu mets la variable "a" à 0. b vaut 20.
La condition de fin de la boucle est b>10 et dans le corps on a la décrémentation de b.
La boucle aura donc 10 itérations. A la fin de la boucle b vaudra 10 (10>10 renvoie faux) et a vaudra 10.
deuxième boucle for :
Tu remets la variable "a" à 0. b vaut toujours 10.
La première condition b<10 échoue. Donc aucune itération.
La variable "a" reste donc à 0. Donc pas d'entourloupe de la part du compilateur ;)
Cdlt
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
14 janv. 2009 à 14:18
14 janv. 2009 à 14:18
comme dit fiddy, c'est logique !
Le problème viens de ton algorithme pas du compilateur.
Enfin, d'un autre coté j'ai aussi remarqué un comportement étrange des boucles for lorsque je commence avec une condition fausse. (i.e. : for(a=0;a<0;a++))
Dans ton cas, je pense qu'une boucle while serait plus clair.
dit nous plutôt quel résultat tu espère avoir.
Le problème viens de ton algorithme pas du compilateur.
Enfin, d'un autre coté j'ai aussi remarqué un comportement étrange des boucles for lorsque je commence avec une condition fausse. (i.e. : for(a=0;a<0;a++))
Dans ton cas, je pense qu'une boucle while serait plus clair.
dit nous plutôt quel résultat tu espère avoir.
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
14 janv. 2009 à 15:29
14 janv. 2009 à 15:29
le dernier 0 indique la valeur de a dans ta deuxième boucle... il n'éxécute la boucle qu'une fois, la condition n'est remplie qu'une fois... A savoir que la condition de fin de ta première boucle est b=11....
Oups la belle connerie que je viens de dire :p
Oups la belle connerie que je viens de dire :p
papymucho
Messages postés
140
Date d'inscription
mercredi 18 juin 2008
Statut
Membre
Dernière intervention
1 novembre 2009
220
14 janv. 2009 à 15:35
14 janv. 2009 à 15:35
Tu viens d'éditer ta réponse ggrr..... de toute façon j'ai dit n'importe quoi :p
Bah si c'est normal ;-)
{
long a=0,b=20,n;
while (b>10)
{
a++;
b--;
printf("%ld\n",a); //=1- 2 -3 - 4 5 - 6 - 7 - 8 - 9 - 10
}
printf("%ld\n",b); //=10
while (b<10) // CONDITION REMPLIE, tu ne rentre pas dans la boucle
{
a--;
b++;
printf("%ld\n",a);
}
printf("%ld\n",a); //=10
system("pause");
return (EXIT_SUCCESS);
}
donc tes print sont corrects.... Cordialement...
Bah si c'est normal ;-)
{
long a=0,b=20,n;
while (b>10)
{
a++;
b--;
printf("%ld\n",a); //=1- 2 -3 - 4 5 - 6 - 7 - 8 - 9 - 10
}
printf("%ld\n",b); //=10
while (b<10) // CONDITION REMPLIE, tu ne rentre pas dans la boucle
{
a--;
b++;
printf("%ld\n",a);
}
printf("%ld\n",a); //=10
system("pause");
return (EXIT_SUCCESS);
}
donc tes print sont corrects.... Cordialement...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
e-proton
Messages postés
81
Date d'inscription
jeudi 2 octobre 2008
Statut
Membre
Dernière intervention
12 juin 2009
14
14 janv. 2009 à 16:14
14 janv. 2009 à 16:14
Merci super gentil de votre part les gars.
J'ai compris maintenant que l'initialisation dans la boucle for s'exécute toujours même si la condition est fausse comme l'a expliqué Loupius et Fiddy.
Merci de votre aide et bonne journée :)
J'ai compris maintenant que l'initialisation dans la boucle for s'exécute toujours même si la condition est fausse comme l'a expliqué Loupius et Fiddy.
Merci de votre aide et bonne journée :)
14 janv. 2009 à 02:20
tout a fait d accord avec fiddy. Dasn ton cas j utiliserai les short plutôt que les long. ça serait plus rapide selon le compilo.
14 janv. 2009 à 13:34
J'ai essayé d'autres compilateurs mais j'ai toujours le même problème !
essayez le code et vous verrez
Help please...
14 janv. 2009 à 14:28
Pour t'aider, tu peux afficher des :
dans le corps de ta boucle for1 et même astuce pour ta deuxième boucle for. Tu verras le nombre de fois qu'elles sont exécutées.
14 janv. 2009 à 15:20
---------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long a,b=20,n;
for (a=0;b>10;a++)
{
b--;
printf("%ld\n",a);
}
printf("%ld\n",b);
for (a=0;b<10;a--)
{
b++;
printf("%ld\n",a);
}
printf("%ld",a);
system("pause");
return (EXIT_SUCCESS);
}
---------------------------------------------------------------------------------------------
voilà ce que la console m'affiche:
--------------------------------------------------------------------------------------------
0
1
2
3
4
5
6
7
8
9
10
0
appuyer sur une touche pour continuer...
--------------------------------------------------------------------------------------------
les printf à l'intérieur de la boucle et juste avant la seconde boucle s'exécutent normalement. le printf à l'intérieur de la deuxième boucle ne s'exécute pas car la condition est fausse b=10 et la condition est si b<10
MAIS CE QUI EST VRAIMENT BIZARRE C'EST QUE LE PRINTF JUSTE APRÈS LA SECONDE BOUCLE AFFICHE a=0 DONC a A PRIS LA VALEUR 0 PAR LA MAGIE DE DAVID BLAINE !!!) j'aimerai juste savoir pourquoi on rencontre ce problème avec la boucle for ?!!
Avec la boucle de type while ça marche super nickel
--------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long a=0,b=20,n;
while (b>10)
{
a++;
b--;
printf("%ld\n",a);
}
printf("%ld\n",b);
while (b<10)
{
a--;
b++;
printf("%ld\n",a);
}
printf("%ld\n",a);
system("pause");
return (EXIT_SUCCESS);
}
----------------------------------------------------------------------------------------------------------
La console affiche:
----------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
10
10
appuyer sur une touche pour continuer...
----------------------------------------------------------------------------------------------------------
Ce n'est pas de la folie ça ?
14 janv. 2009 à 15:30
Si tu suit le cheminement de l'ordinateur (du moins je l'imagine ainsi)
- tu arrive sur une boucle for, tu regarde le premier argument, l'initialisation.
- tu effectue cette première commande, après tout pourquoi pas !?
- tu regarde la condition de sortie.
Pour moi, une boucle for() écrite ainsi for(x;y;z) est équivalente à une boucle while() suivante :
x;
while(1){
... //corps du for()
if(y) z;
else break;}