Bonjour,
je n'ai pas réussi à trouver d'information sur l'évaluation des opérateurs && et || en C "Arduino", alors je vous livre le résultat de mes investigations.
le problème est de savoir ce que fait le scketch quand il contient une condition du genre :
condition = (condition1) && (condition2);
d'après mes propres expériences, différents compilateurs produisent différents résultats suivant que l'opérateur && est évalué de gauche à droite ou de droite à gauche et si l'évaluation de la deuxième condition (dans l'ordre d'évaluation) dépend du résultat de l'évaluation de la première condition.
Je m'explique par un exemple. Ainsi, pour l'instruction ci-dessus, le programme (une fois compilé) peut évaluer d'abord (condition2) - évaluation de droite à gauche - ou (condition1) - évaluation de gauche à droite. Et si la première condition évaluée est false, il peut évaluer la deuxième (bien que ça ne serve à rien puisque les résultat global sera toujours false), ou bien ne pas le faire, de sorte qu'on peut s'attendre dans des cas extrêmes à plusieurs résultats différents.
ainsi
int i = 2;
int j = 3;
boolean result = (++i < 2) && (++j < 3)
peut conduire à 3 résultats différents suivant l'évaluation du &&. le C "Arduino" conduit à :
result = false
i = 3
j = 3
car l'opérateur && est évalué de gauche à droite, et la deuxième condition (++j<3) n'est pas évaluée, puisque la première est fausse. Quand on dit pas évaluée c'est pas du tout évaluée MEME si il y a un opérateur de pré-incrémentation comme ici ++j. j vaudra donc toujours 3 après calcul de result.
ceci permet des instructions très compactes comme dans cet exemple tiré d'openclassroom où il s’agissait de reproduire avec des LED la bande lumineuse de la voiture K2000. On peut faire la loop en une seule instruction. la fonction allumePinActive() est TOUJOURS appelée (et retourne toujours true mais l'incrémentation (ou la décrémentation) de la pinActive n'est effectuée que si c'est dans le "bon" sens d'allumage. J'ai rajouté des parenthèses inutiles pour la bonne lisibilité du code.
const int NOMBREPIN = 5;
const int DELAI = 100;
const int PREMIEREPIN = 2;
int pinActive = 0;
boolean gaucheDroite = true;
void setup() {
for (int i=0; i<NOMBREPIN; i++) {
pinMode(PREMIEREPIN+i,OUTPUT);
digitalWrite(PREMIEREPIN+i,LOW); // on ne sait jamais
}
}
void loop() {
if (allumePinActive()&&(((gaucheDroite)&&(++pinActive == NOMBREPIN-1)) || ((!gaucheDroite)&&(!(--pinActive))))) gaucheDroite = !gaucheDroite;
}
boolean allumePinActive(){
for (int i=0; i<NOMBREPIN; i++) digitalWrite((PREMIEREPIN+i),(i != pinActive));
delay(DELAI);
return true;
}