Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit probleme de comprehension

    1 juillet 2020 à 10:06:00

    Bonjour, je suis nouveau sur la programmation en c et je n'arrive pas a comprendre pourquoi les resultats de n et p son comme ca

    int n=5,p=2,q,r;
    
        q=n++>p || p++!=3;
        printf("A:n=%d\t     p=%d\t       q=%d\n",n,p,q); 

     resultats : A:n=6   p=2    q=1
    J'ai trouve A:n=6    p=3    q=1

       
        n=5;p=2;
        q=++n==3&&++p==3;
        printf("B:n=%d\t      p=%d\t       q=%d\n",n,p,q);     

     resultat : B:n=6   p=2    q=0
    J'ai trouve B:n=6  p=3   q=0

    -
    Edité par AndrianinaRabe 1 juillet 2020 à 10:59:06

    • Partager sur Facebook
    • Partager sur Twitter
      1 juillet 2020 à 10:31:29

      Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).

      Et bien moi non plus, car après avoir testé ton code je trouve :

      A:n=6        p=2               q=1
      B:n=6         p=2              q=0



      • Partager sur Facebook
      • Partager sur Twitter
        1 juillet 2020 à 10:59:58

        Merci pour ta reponse

        Je voudrais juste savoir pourquoi p ne s'incremente pas

        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2020 à 11:13:54

          En fait, c'est assez subtile, c'est que la deuxième opérande des opérateurs || ou && n'est pas évaluée !

          Pourquoi, car pour le ou || si la première vaut vrai le résultat sera vrai, il n'évalue donc pas la seconde.

          Et pour le et && si la première vaut faux, le résultat sera faux, il n'évalue donc pas la seconde.

          en simplifié :

          #include <stdio.h>
          
          int main(void)
          {
              int p=2, q;
              q = 1 || p++;
              printf("p=%d\n",  p);
          
          
              p=2;
              q = 0 && ++p==3;
              printf("p=%d\n",  p);
              
              return 0;
          }

          et :

          #include <stdio.h>
          
          int main(void)
          {
              int p=2, q;
              q = 1 || p++;
              printf("p=%d\n",  p);
          
          
              p=2;
              q = 0 && ++p==3;
              printf("p=%d\n",  p);
              
              return 0;
          }




          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2020 à 11:29:32

            rouloude a écrit:

            En fait, c'est assez subtile, c'est que la deuxième opérande des opérateurs || ou && n'est pas évaluée !

            Pourquoi, car pour le ou || si la première vaut vrai le résultat sera vrai, il n'évalue donc pas la seconde.

            Et pour le et && si la première vaut faux, le résultat sera faux, il n'évalue donc pas la seconde.

            en simplifié :

            #include <stdio.h>
            
            int main(void)
            {
                int p=2, q;
                q = 1 || p++;
                printf("p=%d\n",  p);
            
            
                p=2;
                q = 0 && ++p==3;
                printf("p=%d\n",  p);
                
                return 0;
            }

            et :

            #include <stdio.h>
            
            int main(void)
            {
                int p=2, q;
                q = 1 || p++;
                printf("p=%d\n",  p);
            
            
                p=2;
                q = 0 && ++p==3;
                printf("p=%d\n",  p);
                
                return 0;
            }




            Merci Beaucoup !
            Je comprends maintenant

            • Partager sur Facebook
            • Partager sur Twitter
              1 juillet 2020 à 11:42:05

              // 1. que fait ce code ? 
              // 2. quels avertissements produit le compilateur ?
              
              int main() 
              {
                 0 || printf("hello\n");
                 1 || printf("world\n");
              }
              
              
              • Partager sur Facebook
              • Partager sur Twitter
                1 juillet 2020 à 19:09:06

                Ce programme ne fait rien,
                Voici le message d'erreur:
                z.c: In function 'main':                                                                                                
                z.c:6:9: error: implicit declaration of function 'printf' [-Werror=implicit-function-declaration]                       
                    0 || printf("hello\n");                                                                                             
                         ^~~~~~                                                                                                         
                z.c:6:9: error: incompatible implicit declaration of built-in function 'printf' [-Werror]                               
                z.c:6:9: note: include '<stdio.h>' or provide a declaration of 'printf'                                                 
                z.c:1:1:                                                                                                                
                +#include <stdio.h>                                                                                                     
                 // 1. que fait ce code ?                                                                                               
                z.c:6:9:                                                                                                                
                    0 || printf("hello\n");                                                                                             
                         ^~~~~~                                                                                                   
                -
                avec le #include <stdio.h> et -Wall -Wextra, je n'ai aucun warning.
                Le programme affiche 'hello' seulement parce qu'il doit évaluer la seconde partie avec le 0 et ne le fait pas avec le 1.
                On pourrait faire un test équivalent avec des && à la place des ||
                Dans ce cas, c'est seulement le 'world' qui serait affiché.

                -
                Edité par PierrotLeFou 1 juillet 2020 à 19:23:03

                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  1 juillet 2020 à 20:25:44

                  Ah !

                  PierrotLeFou a écrit:

                  avec le #include <stdio.h> et -Wall -Wextra, je n'ai aucun warning.

                  Moi j'en ai deux :

                  ...\main.c|6|warning: value computed is not used [-Wunused-value]
                  ...\main.c|7|warning: statement with no effect [-Wunused-value]





                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 juillet 2020 à 23:16:51

                    rouloude a écrit:

                    Ah !

                    PierrotLeFou a écrit:

                    avec le #include <stdio.h> et -Wall -Wextra, je n'ai aucun warning.

                    Moi j'en ai deux :

                    ...\main.c|6|warning: value computed is not used [-Wunused-value]
                    ...\main.c|7|warning: statement with no effect [-Wunused-value]





                    J'ai effectivement ajouté l'option -Wunused et j'ai le même warning

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      2 juillet 2020 à 8:44:05

                      Bref, la conclusion c'est que

                      1. L'opérateur || est évalué en court-circuit, il n'est pas commutatif, mais sequentiel, c'est à dire qu'on evalue d'abord la partie gauche, puis la partie droite seulement si on ne peut pas conclure.  Ce qui est utile dans des tests comme if ( i >= n || t[i] == x).... C'est le cas de &&  et de ?:

                      2. Le compilateur simplifie si la partie gauche est calculable à la compilation

                      3. Il attend qu'on fasse quelque chose du résultat

                      -
                      Edité par michelbillaud 2 juillet 2020 à 12:02:06

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Petit probleme de comprehension

                      × 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