Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de compilation

    10 août 2019 à 21:13:54

    Bonjour,
    Je suis en train de lire le cours de Mathio NEBRA sur le C ,je ne trouve pas le problème , chaque fois je veux tester ce code je trouve qu'il est vrai .
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    { int x=0, y=11 ;
    x=4<y<5;
    printf("%d",x);
    
    
        return 0;
    }
    

    -
    Edité par Mic-helle 10 août 2019 à 21:23:57

    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2019 à 23:10:58

      Qu'est ce qui est vrai? Ce code? Ca ne veux rien dire.

      La ligne 6 est à revoir: on ne peut pas tester des intervalles ainsi en C

      • Partager sur Facebook
      • Partager sur Twitter
        11 août 2019 à 0:26:45

        En C, il existe des opérateurs unaires, des opérateurs binaires et un unique opérateur ternaire.
        - les opérateurs unaires s'appliquent à une seule expression, certains sont avants, certains sont après. exemple -x pour avoir l'opposé
        - les deux expressions se mettent avant et après les opérateurs binaire. exemples : a+b pour le somme, a<b pour l'infériorité, a && b pour un et-logique.
        - le seul opérateur ternaire s'utilise comme cela : test ? sivrai : sifaux

        S'il y a plusieurs opérateurs dans une expression, les plus prioritaires sont effectués avant. Si même priorité, les regroupements se font souvent par la gauche (mais certains regroupent à droite). Les opérateurs unaires sont toujours plus prioritaire que les binaires et ternaire

        -a + -b;        // est compris comme (-a) + (-b), les unaires avant les binaires
        a + b + c;      // est compris comme (a + b) + c, regroupés par la gauche
        d == a + b * c; // est vu d == (a + (b*c)), mult avant add avant == comme en math
        a < b && c < d  // est vu (a<b) && (c<d), égalités/inégalités avant les opérations logiques

        Donc la séquence x = 4 < y < 5;

        x = 4 < y < 5;    // 2 fois opérateur <, il faut grouper par 2 à gauche
        // est vu comme ...
        x = ((4 < y) < 5);
        // 4 < y est vrai car y vaut 11. La valeur vraie c'est 1
        x = (1 < 5);
        // 1 est bien inférieur à 5, donc (1<5) vaut 1
        x = 1;

        Alors pour vérifier si on a bien 4 < y et aussi y < 5, il faut écrire ...

        • Partager sur Facebook
        • Partager sur Twitter
        Bjarne Stroustrup : "C++ has become too expert friendly"
          14 août 2019 à 7:03:43

          Merci Dalfab et zoup ,beaucoup de choses sont devenues claires

          Je pense qu'on doit écrire

          x = 4 < y && y< 5   mais ça marche pas 

          -
          Edité par Mic-helle 14 août 2019 à 7:06:33

          • Partager sur Facebook
          • Partager sur Twitter
            14 août 2019 à 7:56:53

            Un peu de logique : si ça ne marche pas, ce n'est pas ce qu'on devrait écrire.

            Tu devrais commencer par définir clairement ce que ça devrait faire. Comment le faire, ça vient après.

            Ps: aux dernières nouvelles, il n'y a pas d'entier entre 4 et 5.  Il est donc parfaitement normal que  4 < y  && y < 5 soit toujours faux.

            -
            Edité par michelbillaud 14 août 2019 à 7:58:32

            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2019 à 10:24:35

              michelbillaud a écrit:

              Ps: aux dernières nouvelles, il n'y a pas d'entier entre 4 et 5.  Il est donc parfaitement normal que  4 < y  && y < 5 soit toujours faux.

              Je crois que c'est fait exprès, pour tester.

              Comme je ne connais jamais par cœur toutes les priorités des opérations, je préfère mettre des parenthèses, du coup je ferais plutôt :

              x = (4 < y && y< 5)

              (mais je n'ai pas essayé).

              • Partager sur Facebook
              • Partager sur Twitter
                14 août 2019 à 11:54:09

                robun a écrit:


                Comme je ne connais jamais par cœur toutes les priorités des opérations, je préfère mettre des parenthèses, du coup je ferais plutôt :

                x = (4 < y && y< 5)

                (mais je n'ai pas essayé).


                * Si tu dois mettre des parenthèses qui risquent de servir à quelque chose (faciliter la lecture, à défaut de changer les priorités), c'est plutôt

                x = (4 < y) && (y < 5);



                -
                Edité par michelbillaud 14 août 2019 à 11:59:17

                • Partager sur Facebook
                • Partager sur Twitter
                  14 août 2019 à 11:56:17

                  Ah oui, c'est en effet mieux comme ça !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Problème de compilation

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown