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

Eléphant du PHP | 417 Messages

26 août 2006, 20:04

Pendant longtemps, j'ai crû que les opérateurs logiques 'AND' et '&&' (et même chose pour 'OR' et '||') remplissaient les mêmes fonctions. Je savais qu'il y avait des règles de préséance, mais j'étais convaincu qu'ils étaient similaires et donc substituables/interchangeables pour des analyses simples... jusqu'à temps que je me rende compte du résultat dans un script fort simple:
<PRE>
<?php
  $a = "Hello\n";
  $b = "Goodbye\n";

  print "Premier essai\n";
  if (print $a && print $b) {
    print "Pas Bon\n";
  }

  print "\nDeuxième essai\n";
  if (print $a AND print $b) {
    print "Bon\n";
  }
?>
</PRE>
Ce qui donne:

Code : Tout sélectionner

Premier essai Goodbye 1Pas Bon Deuxième essai Hello Goodbye Bon
Je me suis donc mis à condamner && (et par conséquent ||) aux oubliettes et à les éviter dans tous mes scripts et requêtes SQL de nature simple [i.e. ne nécessitant pas une comparaison logique]. Quelqu'un aurait-il un excellent tutorial sur le sujet (outre le manuel PHP) et qui traite des différentes facettes et des applications des opérateurs logiques, en français ou en anglais? Merci.

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

26 août 2006, 20:26

Je ne pense pas qu'il faille condamner les && et || et je ne vois pas bien ce que démontre ton test. Je pense d'ailleurs qu'en utilisant des parenthèses pour disinguer les traitements, tu aurais le bon résultat :
if ( (print $a) && (print $b)) { 
    print "Pas Bon\n"; 
} 
Sans les parenthèses, c'est l'ordre d'exécution qui diffère, et il semble apparement, que "&&" et "AND" n'aient pas la même priorité. Puisque tu as un 1 d'affiché je suppose qu'il l'évalue ainsi : if ( print ($a && (print $b)) )

Il affiche bien le Goodbye, puis le 1, qui correspond à vrai (puisque $a est définie et que le résultat de la fonction print() étant toujours 1)

Pour ma part, ce sont les opérateurs "AND" et "OR" de php que j'ai abandonné, vu que très peu de langages les autorisent, et n'ai jamais eu de soucis dans mes tests :)

Eléphant du PHP | 417 Messages

27 août 2006, 08:16

Merci Ryle. J'apprécie beaucoup!

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 août 2006, 10:18

<mode magical mystery tour>
Hello, Hello ! I don't know why you say goodbye, I say Hello...
</mode magical mystery tour>

Merci pour cette vérification et ton explication, Ryle,
car la découverte de Jazzfinder m'avait beaucoup troublée.

Merci aussi à Jazzfinder d'avoir posté ce sujet,
car j'imagine que pas mal d'entre nous ont dû s'arracher les cheveux
lorsqu'ils se sont retrouvés confrontés à ce paradoxe... :merci:

Pour ma part, je n'avais jamais rencontré ce paradoxe
dans l'interprétation de ces formulations logiques
:idea: car j'isole toujours entre parenthèses chaque clause ou condition
et j'utilise les opérateurs && et || en PHP, et réserve AND et OR pour le SQL.

En respectant ce principe, je n'ai jamais rencontré de faille ni de bug. :wink:

Mammouth du PHP | 19672 Messages

27 août 2006, 10:35

...Je me suis donc mis à condamner && (et par conséquent ||) aux oubliettes et à les éviter dans tous mes scripts et requêtes SQL de nature simple [i.e. ne nécessitant pas une comparaison logique]...
:?: Quel rapport avec le navigateur ? Tu parles de langage serveur, donc les comparaisons sous quelques formes qu'elles soient n'affecteront pas le navigateur.
Les opérateurs logiques

Tableau 15-7. Les opérateurs logiques

Code : Tout sélectionner

+----------+----------+-----------------------------------------------------------+ |Exemple |Nom| | Résultat | +----------+----------+-----------------------------------------------------------+ |$a and $b |ET (And) |Vrai si $a ET $b sont vrais. | |$a or $b |OU (Or) |Vrai si $a OU $b est vrai | |$a xor $b |XOR (Xor) |Vrai si $a OU $b est vrai, mais pas les deux en même temps.| |! $a |NON (Not) |Vrai si $a est faux. | |$a && $b |ET (And) |Vrai si $a ET $b sont vrais. | |a || $b |OU (Or) |Vrai si $a OU $b est vrai. | +----------+----------+-----------------------------------------------------------+
La raison pour laquelle il existe deux types de "ET" et de "OU" est qu'ils ont des priorités différentes. Voir le paragraphe précédence d'opérateurs.
En lisant ceci, on constate d'abord qu'il n'y a pas besoin de faire un cours magistral sur le sujet et il est bon également de tout lire, incluant la dernière phrase qui me semble avoir une grande importance par rapport à ce que tu exposes :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 août 2006, 10:42

...Je me suis donc mis à condamner && (et par conséquent ||) aux oubliettes et à les éviter dans tous mes scripts et requêtes SQL de nature simple [i.e. ne nécessitant pas une comparaison logique]...
:?: Quel rapport avec le navigateur ? Tu parles de langage serveur, donc les comparaisons sous quelques formes qu'elles soient n'affecteront pas le navigateur.
en francais, "i.e." signifie "c'est a dire" ;)

Je voudrais profiter de ce sujet pour rappeller des principes de bases :
- toujours entourer les conditions de parenthèses. L'exemple présent illustre bien comment les priorités des opérateurs peuvent mener à des problèmes de compréhension ...
- pour réaliser des tests simple, il vaut mieux éviter la complexité. C'est con à dire mais if (print($a) && print($b)) est assez compliqué comme test simple :?
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

Mammouth du PHP | 19672 Messages

27 août 2006, 10:58

en francais, "i.e." signifie "c'est a dire" ;)
On doit pas utiliser les mêmes dictionnaires :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 août 2006, 11:03

en francais, "i.e." signifie "c'est a dire" ;)
Ce quiproquo n'est qu'une preuve supplémentaire
qu'il vaut mieux oublier le latin et le grec
pour utiliser le terme français lorsqu'il existe. ;)

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

27 août 2006, 11:36

Ce quiproquo n'est qu'une preuve supplémentaire
qu'il vaut mieux oublier le latin et le grec
pour utiliser le terme français lorsqu'il existe. ;)
Voui, à moins que cela ne soit qu'une preuve supplémentaire de geek attitude, que l'on peut continuer à utiliser le grec ou le latin et essayer de ne pas toujours tout ramener à l'informatique... point-virguleparenthèsefermante

(m'en fout, chuis banni.... :P )

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

27 août 2006, 12:37

On doit pas utiliser les mêmes dictionnaires :langue:
Ce quiproquo n'est qu'une preuve supplémentaire
qu'il vaut mieux oublier le latin et le grec
pour utiliser le terme français lorsqu'il existe. ;)
ie c'est du latin et c'est connu pourtant non ? http://fr.wikipedia.org/wiki/Id_est

Et c'est très utilisé dans les documents anglophones donc comme JazzFinder est Québécois il doit le voir plus souvent que nous autres Français...

Je suis d'accord avec Ryle, t'as été bien au taquet avec ton Internet Explorer Cyrano :lol:

Mammouth du PHP | 19672 Messages

27 août 2006, 15:20

Je suis d'accord avec Ryle, t'as été bien au taquet avec ton Internet Explorer Cyrano :lol:
Gna gna gna :P

C'est la seconde partie qui de toutes façons est le plus utile dans ce que j'avais répondu à propos des opérateurs logiques.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

27 août 2006, 16:04

Primum bibere, deinde philosophari. 8)

Mammouth du PHP | 19672 Messages

27 août 2006, 16:45

Primum bibere, deinde philosophari. 8)
mdrrrrrrr, ha je suis bien entouré dans ce forum, je vous jure, pas un pour racheter l'autre :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 417 Messages

27 août 2006, 18:34

mdrrrrrrr, ha je suis bien entouré dans ce forum, je vous jure, pas un pour racheter l'autre :langue:
Ah! ça, tu peux le dire...
Ça fait plaisir de voir la bonne humeur règner... Les vacances ont été salutaires! :wink:

Merci les Boyz de votre aide! Ça m'éclaire énormément, j'avais la mauvaise habitude de ne pas entourer mes conditions de parenthèses (voir ma logique ci-dessous).
Je vous rappelle que je n'ai jamais pris de cours de PHP, seulement de l'auto-apprentissage et du cassage de nez... essais et erreurs, quoi!

Je me suis peut être mal exprimé quant j'ai parlé d'analyse simple: ce que je voulais dire, c'est que je croyais que ces opérateurs étaient tout à fait similaires lorsqu'on n'avait que 2 conditions (c'est la faute àla doc!). Et à plus de 2, les régles de préséeance s'appliquaient. Erreur!

Maintenant, un peu de latin:
- Autre erreur de ma part: Ils'agit de "i. e." (avec espace), et non de "i.e.". Et c'est du français, voir Le Petit Robert. Je vous pardonne votre ignorance et vos errements, les zenfants! (sermon du dimanche!) :langue:

Note à Cyrano:
J'ai lu cette doc avant de poster. 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).

Bef, je me croyais "avancé" dans mon apprentissage de PHP, non, je reviens à la base, avec 2 objectifs bien précis: Améliorer la syntaxe, et mieux concaténer. L'année scolaire commence! :wink:

Mammouth du PHP | 19672 Messages

27 août 2006, 18:55

Je vous rappelle que je n'ai jamais pris de cours de PHP, seulement de l'auto-apprentissage et du cassage de nez... essais et erreurs, quoi!
Si ça peut t'encourager, dis-toi bien qu'en matière de PHP, j'ai suivi le même chemin et en outre je n'ai aucune formation universitaire en informatique à l'origine, ni même de formation universitaire tout court, j'ai même pas de bac... enfin même si j'ai un niveau de formation Bac+2, mais ça, c'est une autre histoire ;)

Mais justement, ce qui m'a toujours permis de progresser, c'est d'une part un sens de la logique pas trop déficient et surtout je me suis imposé une auto-discipline de codage rigoureuse. Le résultat, c'est qu'en fin de compte, j'ai posé relativement peu de questions ici, et encore moins ailleurs, malgré un taux de participation qu'on peut qualifier d'important :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: