Partage
  • Partager sur Facebook
  • Partager sur Twitter

Priorité des opérateurs

Sujet résolu
    15 septembre 2020 à 18:49:40

    Bonjour, 

    Malgré que j'ai le tableau des priorités des opérateurs sous les yeux, je ne comprend pas les résultats suivant. 

    Pouvez vous me donnez des explications ? 

    Merci d'avance !

    x=3;y=2;z=1;
    x = x && y || z; // Resultat : x=1
    Expression : x||!y&&z //Resultat : Exp=1 
    
    x=y=0;
    z=x++ -1;//Resultat z= -1 et x=1
    z+=-x++ + ++y //Resultat : z=-1 et x=2
    
    x=1;y=1;
    Expression !x|x //Resultat : Exp=1
    Expression ~x|x //Resultat : Exp=-1
    Expression x^x  //Resultat : Exp=0
    x<<=3//Resultat x=8
    y<<=3//Resultat y=8
    y>>=3//Resultat y=1



    -
    Edité par NATHdb 15 septembre 2020 à 18:50:07

    • Partager sur Facebook
    • Partager sur Twitter
      15 septembre 2020 à 19:04:10

      Salut,
      Que veux-tu vraiment faire?
      Les opérateurs && et || sont des opérateurs logiques.
      Les opérateurs & et | sont des opérateurs boolééens bit-à-bit
      3 && 2 -> 1 car les deux sont vrais
      3 & 2 -> 2 car le bit 0 est effacé.
      ...
      • Partager sur Facebook
      • Partager sur Twitter

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

        15 septembre 2020 à 19:47:36

        Salut ! 

        Je cherche à comprendre les résultats, j'ai mis les opérations et les résultats en commentaire mais je cherche à comprendre justement ces résultats.

        Et surtout comprendre la logique.

        • Partager sur Facebook
        • Partager sur Twitter
          15 septembre 2020 à 20:13:04

          Hello,

          Un début de réponse:

          x=3;y=2;z=1;
          
          x = x && y || z; // Resultat : x=1
          On commence par tester si z<>0. Et si c'est le cas, pas besoin d'évaluer x && y: le résultat sera de tout façon VRAI.
          Et si z==0, alors on évalue x && y: cela donnera un résultat VRAI si x et y sont <>0
          Dans le cas présent, z est VRAI donc l'expression est vraie
          Ça s'écrit aussi: (x && y) || z
          
          Expression : x || !y && z //Resultat : Exp=1
          La premiere expression à être évaluée, c'est x. Si x est <>0, alors le résulat est VRAI
          Sinon, on évalue on évalue !y && z.
          Ça s'écrit aussi x || ( (!y) && z)
          
          x=y=0;
          z=x++ -1;//Resultat z= -1 et x=1
          Code plus clair: z=x-1, x++: donc oui, z=-1 et x=1
          
          z+=-x++ + ++y //Resultat : z=-1 et x=2
          Code plus clair:  y=y+1, z+=-1+1 (z reste à -1), x=x+1
          


          Mais celui écrit ce genre de chose dans un programme va se faire flinguer 

          -
          Edité par edgarjacobs 15 septembre 2020 à 20:34:41

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            15 septembre 2020 à 20:55:44

            Salut ! Merci pour tes début de réponse. Oui je comprends ta dernière phrase mais en faite ce sont des exercices que j'ai trouvé pour comprendre le mécanisme des priorités

            Quand tu dis "on commence par tester si z<>0" Cela signifie que toute valeurs différent de 0 est vrai et toutes valeurs égale à zero est fause ? 

            Pourquoi on commence par z d'ailleurs ? Ensuite ces histoires d'opérations avec || et &&, ce n'est pas lié à ces genre tableaux binaires : ?

            OU         ET

            0 0 0    0  0  0

            0 1 1    0  1  0

            1 0 1    1  0  0

            1 1 1     1  1  1

            Ensuite quelle est la différence entre x++ et ++x ? Et du coup pourquoi z = x++ -1 serait l’équivalent de z = x-1, x++ ?

            Puis que signifie cette opération y=<<3 ou y>>=3

            -
            Edité par NATHdb 15 septembre 2020 à 20:56:04

            • Partager sur Facebook
            • Partager sur Twitter
              15 septembre 2020 à 22:02:49

              Houlà. Ça manque de base au sujet des opérateurs en C.

              z=++x et z=x++: dans le 1er cas, on incrémente x AVANT de l'assigner à z, dans le second cas, on l'incrémente APRES l'avoir assigné à z.

              <<= ou >>= : comme += ou -=, sauf que là, ça shifte les bits de la valeur donnée vers la gauche (<<) ou vers la droite (>>). Donc 1<<1 donne 2, 1<<2 donne 4 et 8>>3 donne 1.

              Nano17 a écrit:

              Quand tu dis "on commence par tester si z<>0" Cela signifie que toute valeurs différent de 0 est vrai et toutes valeurs égale à zero est fause ?

              Oui.

              Et, comme l'a écrit PierrotLeFou, il faut faire la différence entre opérateurs binaires et logiques !



              -
              Edité par edgarjacobs 15 septembre 2020 à 23:08:28

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                16 septembre 2020 à 8:07:29

                Merci pour tes explications c'est déjà un peu plus claire :) 

                Oui bah justement c'est pour cette raison que je met un poste sur ce forum :) 

                1<<1, décale de 1 les bits c'est çà ? 

                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2020 à 16:16:19

                  a<<1 décale les bits de a d'une position vers la gauche.

                  a<<=1 (s'écrit aussi a=a<<1) décale les bits dans a d'une position vers la gauche

                  -
                  Edité par edgarjacobs 16 septembre 2020 à 16:19:26

                  • Partager sur Facebook
                  • Partager sur Twitter

                  On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                    16 septembre 2020 à 17:43:12

                    Je dirais comme edgarjacobs, ça manque de bases sur les opérateurs.
                    Ce n'est pas tout que de savoir la priorité relative.
                    Il faut également savoir le sens exact de chaque opérateur.
                    Ça fait partie de l'apprentissage que de savoir la différence entre pré-incrémentation (ou décrémentation) et la post-incrémentation.
                    tableau[i++] ne donnera pas le même effet que tableau[++i]
                    << décale vers la gauche (suis la direction des flèches ...) et >> décale vers la droite.
                    @edgarjacobs:
                    Tu me perds ici ...
                    x = x && y || z; // Resultat : x=1
                    «On commence par tester si z<>0. Et si c'est le cas, pas besoin d'évaluer x && y: le résultat sera de tout façon VRAI.
                    Et si z==0, alors on évalue x && y: cela donnera un résultat VRAI si x et y sont <>0»
                    Ici, les variables ne sont pas modifiées, mais n'est-ce pas la norme que d'évaluer d'abord le premier membre d'un || en premier?
                    S'il est vrai, on n'a pas besoin d'évaluer le second membre.
                    Je pensais que la priorité de && était plus grande que ||, il faudra que je revoie également mes priorités ...¸
                    J'ai fait le petit test suivant:
                    -
                    #include <stdio.h>
                    int f(int i) {
                        printf("executed\n");
                        return(i);
                    }
                    int main() {
                        int e, a, b, c;
                        a = 0; b = 1; c = 1;
                        e = a && b || c;
                        printf("%d\n", e);   // donne 1, donc && a priorité sur ||
                        a = 1; b = 1; c = 1;
                        e = a && b || f(c);
                        printf("%d\n", e);   // f() n'est pas appelé, donc seul a && b est évalué
                    }

                    -
                    Edité par PierrotLeFou 16 septembre 2020 à 18:43:16

                    • Partager sur Facebook
                    • Partager sur Twitter

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

                    Priorité des opérateurs

                    × 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