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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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++ ?
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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
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.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.