Bonjour
Quelques essais en Java (ou Processing) et en C++, concernant les opérateurs logiques.
En Java il y a un vrai type booléen ne pouvant être mélangé avec d'autres.
Soit une petite fonction f avec un effet de bord : boolean f(boolean b) { print("*"); return b; }
cette fonction affiche une étoile chaque fois que la fonction est appelée.
Le programme suivant teste les opérateurs logiques & && | || pour toutes les combinaisons de valeurs booléennes par le biais de la fonction f pour avoir des effets de bord :
boolean a; boolean[] bs={false,true};
println("et");
for (boolean b : bs) for (boolean c : bs) {
a=f(b)&f(c); print(b,"&",c,"=",a," ");
a=f(b)&&f(c); print(b,"&&",c,"=",a," "); println();
}
println("ou");
for (boolean b : bs) for (boolean c : bs) {
a=f(b)|f(c); print(b,"|",c,"=",a," ");
a=f(b)||f(c); print(b,"||",c,"=",a," "); println();
}
cela donne :
et
**false & false = false *false && false = false
**false & true = false *false && true = false
**true & false = false **true && false = false
**true & true = true **true && true = true
ou
**false | false = false **false || false = false
**false | true = true **false || true = true
**true | false = true *true || false = true
**true | true = true *true || true = true
Les opérateurs & && | || sont bien des opérateurs logiques.
Passons au C++, la fonction avec effet de bord s'écrit : bool f(bool b) { cout<<"*"; return b; }
Le programme de test est semblable (à part les affichages) :
bool a; bool bs[]={false,true};
cout<<"et"<<endl;
for (bool i : bs) for (bool j : bs) {
a=f(i)&f(j); cout<<i<<"&"<<j<<"="<<a<<" ";
a=f(i)&&f(j); cout<<i<<"&&"<<j<<"="<<a<<" "; cout<<endl;
}
cout<<"ou"<<endl;
for (bool i : bs) for (bool j : bs) {
a=f(i)|f(j); cout<<i<<"|"<<j<<"="<<a<<" ";
a=f(i)||f(j); cout<<i<<"||"<<j<<"="<<a<<" "; cout<<endl;
}
Le résultat est le même (à part l'affichage des booléens)
**0&0=0 *0&&0=0
**0&1=0 *0&&1=0
**1&0=0 **1&&0=0
**1&1=1 **1&&1=1
ou
**0|0=0 **0||0=0
**0|1=1 **0||1=1
**1|0=1 *1||0=1
**1|1=1 *1||1=1
En C++ les booléens sont en fait des entiers particuliers (on peut écrire 3+true ce qui donne 4).
En conclusion les opérateurs & && | || ressemblent bien à des opérateurs logiques. Mais en pratique dans les documentations Java ou C++ on n'en parle quasiment pas .
Cordialement
Pierre