Logique des opérateurs logiques 'AND' et '&&'

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2006, 00:42

Elle induit en erreur (le débutant, il va de soi). Elle donne, par exemple, la même logique à ($a and $b) et ($a && $b).
Ah ben vi, mais ça c'est vrai, avec $a et $b étant des variables (plus précisément des booléens, mais php interprete tout ce qui est vide, non défini ou null comme faux et le reste comme vrai, ca revient au même)

Ca reste donc vrai pour des variables (booléens, nombres, chaines, ...), pour des fonctions retournant un résultat (et donc une variable), mais dès le moment ou il s'agit de l'exécution de commande, pour respecter la notion de "valeurDe$a ET valeurDe$b" il est normal de mettre des parenthèses pour identifier clairement $a et $b :)

(chais pas si je suis très clair moi en revanche... :))

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

28 août 2006, 09:00

($a && $b) est très différent de (print $a && print $b)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2006, 10:13

(bon ben vala, comme ça je sais que j'étais pas clair ;))

Je ne voulais pas dire que "$a" donnait le même résultat "print $a", mais juste que l'écriture (Element1 && Element2) était équivalente à (Element1 AND Element2) à condition de respecter cette forme et donc d'utiliser les parenthèses pour déterminer clairement Element1 quand cela est nécessaire :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 août 2006, 12:32

Il faut faire attention au cas général de l'utilisation des opérateurs logiques et au cas particulier de l'exemple utilisé par notre ami (cas de l'usage d'une fonction (ici Print) ) pour ne pas se méler les pinceaux.

Le cas général:
------------------
La différence majeure entre les opérateurs AND/OR/&/| et &&/|| (doublés) est que :

Les opérateurs AND, OR, & et | de base:
1.
  • Pour ce premier groupe d'opérateurs, toutes les expressions logiques qui composent la condition sont vérifiées avant de prendre la décision d'un état vrai ou faux.
Exemple :

Code : Tout sélectionner

if (A==1 AND B==2 & C==3) { print "vrai";} else { print "faux"; }

Exécution:

Si on a :
A=1;
B=2;
C=3;
Cette alternative affiche "vrai" car toutes les expressions sont vraies et pour le savoir l'exécuteur a dù évaluer toutes les expressions composant la condition. En trouvant le résultat logique suivant :
VRAI AND VRAI & VRAI qui est égal à VRAI.

Et si on a :
A=0;
B=2;
C=3;
Cette alternative affiche "faux" car toutes les expressions ne sont pas vraies et pour le savoir l'exécuteur a dù évaluer toutes les expressions composant la condition. En trouvant le résultat logique suivant :
FAUX AND VRAI & VRAI qui est égal à FAUX.

Théorème :
  • L'alternative évalue toutes les expression logiques combinée par les opérateurs logiques : AND, OR, & et | avant de décider de l'état VRAI ou FAUX.
    En principe, l'ordre des expressions jointes obéie à la loi bijective et au lois de distributivité :
    Bijectivité:
    A AND B = B AND A
    Distribution:
    A AND (B OR C) = (A AND B) OR (A AND C)
    A OR (B AND C) = (A OR B) AND (A OR C)
    Voir les lois de Bool et de Morgan

Les opérateurs && et ||

2.
  • Ce deuxième groupe d'opérateurs est une variante du premier groupe de base et simplifie le méchanisme d'évaluation d'une condition composée d'une suite d'expressions logiques dépondantes fonctionnellement. C'est à dire que si une première expression de la suite n'est pas vraie il serait inutil d'évaluer le reste de la suite. La décision d'un état vrai se fait si toutes les expression de la suite sont varies et la décision d'un état faux se fait dès qu'une des expression de la suite est fausse.
Exemple :

Code : Tout sélectionner

if (i>=0 && i<count(tableau) && tableau[i] != null) { print "vrai";} else { print "faux"; }

Exécution:

Si on a :
tableau = array (1, 2, 3);
i=1;

Cette alternative affiche "vrai" car toutes les expressions sont vraies et pour le savoir l'exécuteur a dù évaluer toutes les expressions composant la condition. En trouvant le résultat logique suivant :
VRAI && VRAI && VRAI qui est égal à VRAI.
Ce qui est logique car puisque i est égal à 1 c'est un indice correct du tableau ce qui permet fonctionnellement d'accèder à la case n°1 du tableau sans erreur d'accès.

Et si on a :
tableau = array (1, 2, 3);
i=4;

Cette alternative affiche "faux" car au moins l'expression 2 est fausse puisque i n'est pas < à la taille du tableau (3) le reste de la condition n'est alors pas évalué (car logiqument inutil : la case n°4 n'existe pas dans tableau) La décision trouvée est prématurée :
VRAI && FAUX qui est égal à FAUX.
Ici l'exécuteur a économisé une évaluation dù à l'enchainement logique de dépondence entre les expressions tel que le programmeur l'a pensé.

Théorème :
  • La condition de l'alternative est composée d'une suite d'expressions logiques dont l'ordre est important et détermine une certaine dépondence fonctionnelle entre les expressions.
    L'alternative arrête la décision à FAUX pour && et à VRAI pour || dès qu'une expression composant la condition est fausse pour && et vraie pour ||

    Attention, la dijection n'est pas tolérée logiquement car l'ordre établi par le programmeur entre les expressions obéi à une dépondence fonctionnelle que seul ce programmeur connait et donc :
    A && B pourrait ne pas être équivalente à la logique de dépondence de B && A
    Même remarque pour la distributivité entre && et ||
Conclusion:
Lorsque les expressions composant une condition sont liées par une dépondence fonctionnelle il vaudrait mieux utiliser les opérateurs doublés && et || pour programmer une situation sans erreurs
Dans le cas contraire, les opérateurs de base sont suffisants.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 417 Messages

29 août 2006, 00:14

Merci sadeq, et merci à vous tous pour vos conseils éclairés.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 août 2006, 10:06

Il est Résolu ce topic ?

Eléphant du PHP | 417 Messages

29 août 2006, 16:47

Il est Résolu ce topic ?
Désolé. J'ai tellement pas posé de questions sur ce forum que j'ai oublié l'existence de cette fonction.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 août 2006, 16:49

Désolé. J'ai tellement pas posé de questions sur ce forum que j'ai oublié l'existence de cette fonction.
Rooh l'ot' comme il se la pète :P

Mammouth du PHP | 19672 Messages

29 août 2006, 17:10

Désolé. J'ai tellement pas posé de questions sur ce forum que j'ai oublié l'existence de cette fonction.
lol, est-ce que ça devrait pas être pire pour moi au nombre de réponses faites sur ce même forum ? :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

29 août 2006, 17:15

/!\

Image
Detected !

C'est nul on peut plus mettre d'image ? :(

Edit : Ah si :D
Modifié en dernier par ouckileou le 29 août 2006, 23:09, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

29 août 2006, 18:04

Bien sûr que si, petit scarabée... :langue:

Image

Mammouth du PHP | 19672 Messages

29 août 2006, 18:09

lol, enfin bon, je n'ai pas votre culture et un détail a dû m'échapper, je capte pas le rapport avec le melon :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 2291 Messages

29 août 2006, 18:44

Désolé. J'ai tellement pas posé de questions sur ce forum que j'ai oublié l'existence de cette fonction.
lol, est-ce que ça devrait pas être pire pour moi au nombre de réponses faites sur ce même forum ? :langue:
:afraid: 13861 tu dort ici :?: :lol:
Bon je sort.....
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 417 Messages

29 août 2006, 22:15

Désolé. J'ai tellement pas posé de questions sur ce forum que j'ai oublié l'existence de cette fonction.
lol, est-ce que ça devrait pas être pire pour moi au nombre de réponses faites sur ce même forum ? :langue:
Le meilleur moyen de faire planter un navigateur, c'est de cliquer sur le Profil de Cyrano, puis de choisir l'option: Trouver tous les messages de Cyrano! :wink:

Mammouth du PHP | 19672 Messages

29 août 2006, 22:18

Même pas, il y a une clause LIMIT 0, 15 :P
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: