Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème if/else, while

avec Visual C++

    4 juillet 2009 à 23:59:51

    Bonjour ou bonsoir,

    Je me suis lancé dans l'apprentissage du C grâce au Site du Zéro mais je rencontre des problèmes en ce qui concerne les variables.
    Voyez plutôt ce code :

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int variable=5;
    	if (variable=6)
    		{
    		printf ("Il y a un probleme.");
    		}
    	else
    		{
    		printf ("Tout est OK.");
    		}
        return 0;
    }
    


    Ce code est très simpliste mais il me pose un problème.
    Après compilation et lorsque je lance le programme, je n'obtiens pas un message disant "Tout est OK." mais bien un "Il y a un probleme."...
    Le problème est le même avec les boucles :

    int variable=5;
    	while (variable=6)
    		{
    		printf ("Boucle infinie.");
    		}
    


    Quelqu'un saurait-il la cause de ce problème?
    C'est très génant car je ne peux rien coder du tout ainsi...
    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      5 juillet 2009 à 0:11:59

      Tu as oublié quelque chose de promordiale dans le if (erreur de débutant ;))
      Tu as initialisé ta variable int "variable" à 5.
      Ensuite, d'après ton code, tu demandes que si la variable vaut "vraie" cela te renvoit "Il y a un problème".

      Conclusion:
      Tout s'explique, quand on veut comparer, affecter une variable à quelque chose, il faut utiliser les deux "==" et non un seul "=".
      Ton code serait donc :


      #include <stdio.h>
      #include <stdlib.h>
      
      int main()
      {
      	int variable = 5;
      	if (variable == 6)
      		{
      		printf ("Il y a un probleme.");
      		}
      	else
      		{
      		printf ("Tout est OK.");
      		}
          return 0;
      }
      


      <gras>"Ressort quelque chose du chapitre des boolens":

      0 = Faux
      1 = Vrai (Et tous les autres nombres valent aussi vrai car ils sont différents de 0)
      • Partager sur Facebook
      • Partager sur Twitter
        5 juillet 2009 à 0:18:28

        Ouh j'ai honte!
        C'est bien indiqué en plus dans le tuto de M@teo!
        Bon bah au moin je ne l'oublierai plus à l'avenir ^^"
        Merci de la réponse et bonne soirée :p
        • Partager sur Facebook
        • Partager sur Twitter
          5 juillet 2009 à 0:21:05

          Une erreure qui est arrivée à tout le monde (si une personne ne s'est jamais trompée, présentez la moi !)
          • Partager sur Facebook
          • Partager sur Twitter
            5 juillet 2009 à 0:22:22

            Ben le problème ici, c'est que tu confonds deux opérateurs très proches par leur syntaxe mais qui n'ont rien à voir au niveau du sens. Il y a l'opérateur '=', qui est un opérateur d'assignation, c'est à dire que, par exemple, dans "variable = 6", tu modifies la valeur de "variable" à 6. Après, il y a '==', qui est un opérateur de comparaison. Il compare ses deux opérandes, l'un à gauche et l'autre à droite et nous dit s'il y a égalité ou non.

            C'est bien '==' que tu voulais visiblement utiliser. La signification des deux est sensiblement différentes, une confusion comme celle que tu viens de faire change forcément le sens de ton programme et tu es donc surpris quand tu en vois le résultat. L'erreur se voit trop souvent sur ce forum et je ne saurais dire où se trouve la faute à la base, dans inattention des membres trop pressés ou le tutoriel de M@t qui n'est peut-être pas assez clair à ce sujet.

            Maintenant, cette erreur peut également t'être bénéfique, et ce deux fois au moins : tu seras beaucoup plus vigilant à cela par l'avenir et en comprenant pourquoi le programme a untel fonctionnement avec '=' à la place de '==', tu comprendras même mieux comprendre la manière dont fonctionne le C.

            Le type bool que l'on retrouve dans de nombreux langages (OCaml, C++, etc.) n'existe pas en C : on le "simule" avec n'importe quel autre type. Si la valeur d'une variable de n'importe quel type est nulle (0, 0.0, NULL, etc.), la condition est considérée comme fausse. Autrement, comme vraie. Dans ton premier code, tu assignes 6 à "variable" (la valeur 5 est écrasée et on en parle plus) et tu évalues donc 6. Cette valeur sera considérée comme un "vrai", on entre donc dans le if et non dans le else. Si tu as compris cela, tu peux très facilement comprendre pourquoi ton second code provoque une boucle infinie.

            Grillé, mais c'est pas grave.
            • Partager sur Facebook
            • Partager sur Twitter
              5 juillet 2009 à 0:24:37

              Prennez l'habitude de faire :
              if(5 == var)
              /* au lieu de */
              if(var == 5)
              

              pour que ce genre d'erreur soient détéctées à la compilation.
              • Partager sur Facebook
              • Partager sur Twitter
                5 juillet 2009 à 0:48:58

                Citation : Camp0us

                pour que ce genre d'erreur soient détéctées à la compilation.



                Ou alors on règle son compilateur correctement ...
                • Partager sur Facebook
                • Partager sur Twitter
                  5 juillet 2009 à 12:05:30

                  N'importe quoi joccd. "if(var = 5)" est syntaxiquement et sémantiquement correct. On peut vouloir le faire volontairement.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 juillet 2009 à 12:21:17

                    bonjour

                    Citation : ShareMan

                    N'importe quoi joccd. "if(var = 5)" est syntaxiquement et sémantiquement correct. On peut vouloir le faire volontairement.


                    le faire volontairement dans quel but ?
                    Surtour que "var=5" n'est pas le resultat d'une condition mais une affectation : pourquoi c'est syntaxiquement et sémantiquement correct ?


                    Citation : Campous

                    Prennez l'habitude de faire :

                    if(5 == var)
                    /* au lieu de */
                    if(var == 5)
                    



                    pour que ce genre d'erreur soient détéctées à la compilation.



                    merci pour l'info, je vais essayer
                    @+



                    Post scriptum :
                    #include <stdio.h>
                    #include <stdlib.h>
                    
                    int main()
                    {
                        int a=2;
                        if (a=3) printf("Ok");
                        else  printf("Hello world!\n");
                        return 0;
                    }
                    

                    --> le compilo (même réglé permissif) indique quand même un warning
                    C:\Documents and Settings\a\main.c|7|warning: suggest parentheses around assignment used as truth value|
                    


                    alors que la méthode de Campous indique une erreur :
                    #include <stdio.h>
                    #include <stdlib.h>
                    
                    int main()
                    {
                        int a=2;
                        if (3=a) printf("Ok");
                        else  printf("Hello world!\n");
                        return 0;
                    }
                    

                    C:\Documents and Settings\a\main.c|7|error: invalid lvalue in assignment|
                    


                    CQFD merci Campous !


                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 juillet 2009 à 17:34:05

                      zx-spectrum, je sais parfaitement de quoi je parle et ta réponse ne veut surtout rien dire. Pourquoi le faire volontairement ? Par exemple si tu souhaites évaluer une expression dans un if et en récupérer le résultat dans une variable pour une action future, tu aurais quelque chose du style "if(var = expr)", le if évalue bien var donc indirectement expr et tu récupères le résultat ("d'une pierre deux coups" si l'on veut). De plus, je trouve que le warning que tu présentes est sans intérêt (voir stupide), ce n'est en rien un argument d'autorité ici.

                      C'est syntaxiquement correct parce que ça suit la syntaxe du C et en termes de compilation, l'analyse syntaxique réussit à en construire un arbre abstrait, ce qui est bien sûr une conséquence du fait que tous les terminaux soient bien reconnus à partir de l'axiome de la grammaire décrivant le C.

                      C'est sémantiquement correct parce qu'il n'y a pas de problème de type (bool n'existant pas en C), ni de problème de r-value l-value et encore moins de problème de syntaxe non-représentable par la grammaire de l'analyse syntaxique ; ni tout autre problème de sémantique possible.

                      Il est tout à fait normal que la méthode de Camp0us provoque une erreur, qui a lieu lors de l'analyse sémantique sans doute, à cause du problème r-value l-value qui se pose dans "5 = var" par exemple. À gauche, on doit retrouver une expression qui fait référence à un endroit "assignable" et à droite, on doit retrouver une valeur.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 juillet 2009 à 0:09:30

                        Citation : shareman

                        zx-spectrum, je sais parfaitement de quoi je parle et ta réponse ne veut surtout rien dire. Pourquoi le faire volontairement ?


                        je suis surpris par tes propos. Le fait que tu sois valideur ne t'octrois pas le droit de me juger....

                        primo : j'ai rien compris à ton debalage de savoir. Par pitié pour l'ensemble des zeros mets toi à notre portée : "Savoir c'est savoir transmettre ses connaissances ", pas les débaler.

                        secundo :

                        Citation : shareman

                        De plus, je trouve que le warning que tu présentes est sans intérêt (voir stupide), ce n'est en rien un argument d'autorité ici.

                        En quoi c'est stupide de montrer en faisant un test que donne le compilo, et donc de confirmer la position de Campous ? Ensuite je suis pas une "autorité" je n'en n'ai ni l'envie , ni les capacités , ni le temps de le faire. Alors par pitié quand je pose des questions même si c'est pas l'avis de tout le monde, soit on repond proprement, soit on passe son chemin.......

                        Ensuite la oui maintenant VOLONTAIREMENT je réitère ma question :

                        Citation : shareman

                        N'importe quoi joccd. "if(var = 5)" est syntaxiquement et sémantiquement correct. On peut vouloir le faire volontairement.


                        le faire volontairement dans quel but ?
                        Surtour que "var=5" n'est pas le resultat d'une condition mais une affectation : pourquoi c'est syntaxiquement et sémantiquement correct ?
                        et pour aller plus loin je rappelle qu'en C la traduction algorithmique de :
                        si (var=5) alors action1
                        

                        est
                        if (var==5) {/* action1 */ }
                        


                        En quoi
                        if (var=5) { /* action1 */ }
                        

                        Dans quel but peut on le faire volontairement, et en quoi c'est syntaxiquement et sémantiquement correct ?
                        Pour ma part j'en suis resté :
                        "==" pour comparer, "=" pour l'affectation



                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 juillet 2009 à 0:19:54

                          On peut faire des choses comme :
                          while ((c = getchar()) != EOF)
                          {
                               /* ... */
                          }
                          


                          C'est plus rapide a écrire, et plus clair peut etre aussi que de faire c = getchar() dans la boucle. A noter les parentheses dues a la priorite de l'operateur == sur l'operateur = (ce qui est logique, sinon on aurait des parentheses partout).

                          Sinon, ca peut aussi servir a stocker la valeur de retour d'une fonction qui dispose d'un code d'erreur, etc...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 juillet 2009 à 0:27:17

                            Citation : ShareMan

                            N'importe quoi joccd. "if(var = 5)" est syntaxiquement et sémantiquement correct. On peut vouloir le faire volontairement.



                            Je sais très bien que c'est correct, mais un compilateur bien réglé demande (voire force) l'ajout de parenthèses. Cela permet de voir tout de suite l'erreur (sauf si la personne ne connait pas la différence entre = et ==). Je trouve cela une bien meilleur solution que de commencer à faire 5 == var (fonctionnelle mais tordu)

                            @zx-spectrum : cela permet juste de gagner une ligne
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juillet 2009 à 0:33:14

                              Le compilateur ne forcera pas l'ajout de parentheses parce qu'elles ne sont pas nécessaires ici, comme l'a dit ShareMan, comme le montre le warning de zx-spectrum, il s'agit d'une suggestion, destinée a rendre le code plus lisible, mais ne changeant en rien son comportement. De plus, je ne vois pas ou est le mal de commencer a faire 5 == a, car il est vrai que l'instruction 5 = a ne compilera pas, et cela permet donc d'éviter cette faute, qui est, il est vrai, récurrente chez les débutants (comme l'a fait remarquer ShareMan, on voit beaucoup de posts sur ce forum dus a ce probleme).
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 juillet 2009 à 0:42:35

                                Citation : Hauru

                                Le compilateur ne forcera pas l'ajout de parentheses



                                Ca c'est toi qui le dit, si je rajoute certaines options mon compilateur bloquera la compilation (d'où le "voire")
                                Je trouve que 5 == a fait perdre beaucoup en compréhension (chose importante pour un débutant) alors que la lecture des messages du compilateur est tout aussi efficace
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 juillet 2009 à 0:53:22

                                  Ben zx-spectrum, je ne profite en rien de mon statut de valido, valido ou pas, j'aurais répondu la même chose, même si c'est un peu sec. Je comprends que tu puisses paraître surpris, mais tu peux aussi comprendre que ta réponse ne servait à rien là. Ensuite, il ne faudrait peut-être pas que tu te vexes et que tu te mettes à dire n'importe quoi sous prétexte que j'ai descendu ton post un peu trop rapidement. Je ne t'ai pas jugé toi, mais ce que tu as écrit.

                                  Tu es libre d'appeler ça "déballage de savoir". Au fond ça ne change rien : si tu sortais de ton état de fierté bien visible et si tu avais vraiment envie d'apprendre des choses qui pourraient t'être utiles, tu aurais pu tout comprendre sans problème, peut-être avec une ou deux recherches sur Google en plus et c'était réglé.

                                  Ce que je ne voulais surtout pas, c'est que les débutants restent sur ton post et qu'il n'y ait rien après, il faut leur apprendre qu'une telle syntaxe est possible et totalement correcte en C, parfois même très pratique. Si tu n'a jamais été amené à l'utiliser, ce n'est pas pour autant que ça n'existe pas.

                                  Ensuite, je n'ai pas dit que ton test était stupide, mais je pense en toute franchise que le warning l'est. De quelle position de Camp0us parles-tu ? Il a juste montré une petite astuce pratique pour ne pas s'embrouiller, je pense que c'était déjà assez évident pour ne pas devoir être "confirmé". Et non, je n'ai pas dit que tu étais une autorité, mais visiblement, tu voulais utiliser le warning comme argument d'autorité (cf google).

                                  Ma réponse était propre, "ta réponse ne veut rien dire" n'est pas à prendre comme une insulte comme tu sembles le faire, mais comme une simple constatation, il serait dommage que les débutants partent avec l'idée que "if(var = 5)" soit faux syntaxiquement et sémantiquement (hum). Mais j'avoue que mon post était sec, tout comme celui-ci, car j'insiste, c'est dommage que pendant que je déballe des arguments, tu déballes des choses totalement irréfléchies.

                                  Pour le "if(var = 5) dans quel but", j'y ai répondu. Idem pour le "syntaxiquement et sémantiquement correct". Et j'ai du mal à voir le lien avec le pseudo-code (Affectation <- ?).
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 juillet 2009 à 12:52:56

                                    Citation : shareman

                                    Ce que je ne voulais surtout pas, c'est que les débutants restent sur ton post et qu'il n'y ait rien après, il faut leur apprendre qu'une telle syntaxe est possible et totalement correcte en C, parfois même très pratique. Si tu n'a jamais été amené à l'utiliser, ce n'est pas pour autant que ça n'existe pas.


                                    Excuse moi DIEU, j'attends toujours a quoi ca sert?


                                    Citation : shareman

                                    Pour le "if(var = 5) dans quel but", j'y ai répondu. Idem pour le "syntaxiquement et sémantiquement correct". Et j'ai du mal à voir le lien avec le pseudo-code (Affectation <- ?).


                                    Ben comme je suis l'idiot du village, il faut que je fasse avec la même explication, a savoir "ton debalage de savoir" que j'ai lu en boucle, mais qui m'avance a rien...

                                    Citation : shareman

                                    Ce que je ne voulais surtout pas, c'est que les débutants restent sur ton post et qu'il n'y ait rien après


                                    Effectivement ça nuit à l'image de marque, et c'est moi qui suit "fier".............et ben non je revendique mon état humble pour te dire que j'ai toujours rien compris à ton Mic-Mac
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 juillet 2009 à 14:04:37

                                      Bonjour,

                                      Shareman et zx-spectrum (ainsi que les autres), ce débat ne peut avoir lieu sur ce topic, d'autant plus que l'auteur n'y participe pas.

                                      Vous êtes priés de continuer via MP si ça vous chante, mais pas ici.

                                      Merci.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      HR Community Manager for Viadeo@Work4Viadeo on Twitter, or join our group here.
                                        8 juillet 2009 à 14:12:40

                                        Citation : shareman

                                        Pourquoi le faire volontairement ? Par exemple si tu souhaites évaluer une expression dans un if et en récupérer le résultat dans une variable pour une action future, tu aurais quelque chose du style "if(var = expr)", le if évalue bien var donc indirectement expr et tu récupères le résultat ("d'une pierre deux coups" si l'on veut).



                                        Je rajoute en plus qu'avant de gueuler, spectrum, ça aurait été bien que tu te mettes à lire ce qu'on écrit. Shareman a donné le pourquoi dans ce que je viens de citer. Tu fais preuve d'une mauvaise foi flagrante.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 juillet 2009 à 18:59:40

                                          Citation : rotoclap

                                          Citation : shareman

                                          Pourquoi le faire volontairement ? Par exemple si tu souhaites évaluer une expression dans un if et en récupérer le résultat dans une variable pour une action future, tu aurais quelque chose du style "if(var = expr)", le if évalue bien var donc indirectement expr et tu récupères le résultat ("d'une pierre deux coups" si l'on veut).



                                          Je rajoute en plus qu'avant de gueuler, spectrum, ça aurait été bien que tu te mettes à lire ce qu'on écrit. Shareman a donné le pourquoi dans ce que je viens de citer. Tu fais preuve d'une mauvaise foi flagrante.



                                          Faire de la para-phrase, c'est pas expliquer de manière differente.Je n'ai toujours pas compris l'explication donné ci dessus en sachant que le cours dit bien :
                                          = est reserve pour les operations d'affection
                                          == est reserve pour comparer
                                          donc quand je vois
                                          "if(var = expr)"
                                          j'ai le droit de m'interroger et je n'ai jamais remis en compte les explications que l'on m'a fourni.
                                          Un exemple serait certainement le bien venu, car la re-explication mot a mot porte à confusion, pour tous ceux qui essayent d'apprendre.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 juillet 2009 à 19:12:49

                                            Bah imagine une fonction qui, comme la fonction main, retourne 0 si tout c'est bien passé et autre chose s'il y a un probleme, la valeur de retour etant differente en fonction du probleme. En faisant cela, tu peux stocker la valeur de retour dans une variable tout en testant par exemple si elle est differente de zero. Ca permet de verifier par la suite, grace a la variable qui stocke le retour, d'identifier le probleme si besoin est. C'est une utilisation qui me vient comme ca, mais il y en a certainement d'autres.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Problème if/else, while

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown