Ardu? No!Initiation ≫ Doubles conditions

Doubles conditions

Entre 5 et 17

Plus pour un but pédagogique, mais il ne faut pas le dire, je voudrais maintenant compter mon cache-cache lentement au début pour faire croire que je vais compter lentement, puis aller vite jusqu'à 17 et ralentir à la fin. Avec une frise temporelle, cela donne:

1   2   3   4   5 6 7 8 9 10 11 12 13 14 15 16 17     18   19   20

Si c'était le vrai jeu, j'ajouterai que je baisse d'un ton quand je compte vite, mais là j'ai écris comme j'ai pu. On va donc dire: si le nombre cacheCache est entre 5 et 16 inclus alors j'attends 0,3s sinon j'attends 1s. On peut aussi coder: si le nombre cacheCache est strictement plus petit que 5 ou strictement plus grand que 16 alors j'attends 1s sinon j'attends 0,3s . Mathématiquement on inverse la condition et on inverse la conclusion.

Si cacheCache est entre 5 et 16

On serait tenté d'écrire:

if (5 <= cacheCache <= 16) ...

mais cela ne passe pas pour le C, <= est une opération sur deux données et il comprendrait sans doute:

if ( 5 <= (cacheCache <= 16)) ...

Il va calculer cacheCache <= 16 et va trouver vrai ou faux, puis il va faire la comparaison entre 5 et vrai ou entre 5 et faux. On verra plus tard que cela à un sens, mais pas du tout celui qui nous intéresse ici. Il faut traduire plutôt: si (5 <= cacheCache) et (cacheCache <= 16) ... Dans certains langages on dit AND, mais en C on utilise && (double et). Si on met qu'un seul &, cela a une signification légèrement différente. On écrira donc:

if ((5 <= cacheCache) && (cacheCache <= 17)) delay...;

Comme cela on est tranquille, on ne se pose pas de questions. Vous noterez que chaque parenthèse a sa copine.

Écrivez donc le programme qui compte de 1 à 20, avec ce que nous avons appris dans les chapitres précédents, qui compte toutes les secondes jusqu'à 5, puis plus vite, toutes les 0,3s jusqu'à 17, puis lentement (1s) jusqu'à 20. Solution?int cacheCache; void setup() { Serial.begin(115200); } void loop() { Serial.println(cacheCache++); if ((5 <= cacheCache) && (cacheCache <= 17)) delay(300); else delay(1000); if (cacheCache >= 20) delay(0xFFFFFFFF); }

Priorité des opérateurs

Et si on ne mettait pas les parenthèses? Et bien cela marcherait parce que le C va d'abord faire les <= avant le &&. On dira que les comparaisons sont plus prioritaires que les "ET" binaires (entre deux valeurs). Voici un extrait pour aujourd'hui des priorités, un tableau plus complet se trouve à la page priorité:

Le plus prioritaire
- ++ --opérateurs unaires
* /multiplication, soustraction
+ -addition et soustraction entre 2 valeurs
<< >>décalages
< > <= >=comparaisons
== !=tests d'égalités
&&et logique
||ou logique
= += -= *= /=affectations
Le moins prioritaire

Si on met des parenthèses en trop, cela ne changera pas le code final, et n'a donc aucune incidence sur la vitesse d'exécution. Si on met trop ou trop peu de parenthèses, cela peut nuire à la lisibilité. C'est donc aussi du ressenti de chacun de mettre ou pas certaines parenthèses. Si vous ne connaissez pas bien les priorités, au lieu de chercher une table des priorité et d'économiser sur le nombre de caractères présent, il est plus facile de mettre des parenthèses. Cela permet peut être aussi aux lecteurs de mieux comprendre car ils peuvent être dans la même situation.

Si cacheCache n'est pas entre 5 et 16

On dit dans le style C, mais exprimé en français: si cacheCache est strictement plus petit que 5 ou bien que cacheCache est strictement plus grand que 16 ... Cette fois-ci, c'est le OU qu'il nous faut. Le OU se note avec une double barre verticale || une seule est aussi un OU, mais pas celui qui nous intéresse ici. On peut donc écrire:

if (cacheCache < 5  ||  cacheCache > 16) delay(1000);
else delay(300);

Et différent?

Le NON se traduit par le symbole point d'exclamation. Il fallait bien trouver un symbole! Et pour écrire différent, on écrira "non égal":

if (a == b )... // si a égal b
if (a != b )... // si a différent de b

Ne symbole du NON peut aussi être utilisé comme négation d'une condition:

if ( !(a == b) )... // si a différent de b

Vous avez maintenant presque tout ce qu'il vous faut pour faire toutes vos conditions.