A la limite j'aurai plus facilement accepté que digitalX utilise soit VRAI soit FAUX, ce qui me semble plus cohérent avec le fonctionnement d'un microcontroleur qui n'est qu'un assemblage de circuits logiques -> ah j'ai écrit circuits logiques
Oui, ils auraient pu faire ce choix. Ils auraient pu dans ce cas définir
#define HIGH true
#define LOW false
mais ils ne l'ont pas fait. La raison sans doute c'est qu'en C++ true
n'est pas juste le chiffre 1 et false
0, ce sont des constantes typées du type "valeur de vérité", un type à part entière alors qu'en C ce type n'existe pas. Ce sont les règles de promotion implicite qui font que vous pouvez les "voir" comme ces valeurs.
AMHA HIGH et LOW ne sont pas plus propre que 1 et 0.
techniquement vous avez raison c'est la même chose. Ce que j'essaye d'exprimer, peut-être mal, est sémantique et pédagogique. Je trouve que lire digitalWrite(ledChauffage, digitalRead(ledChauffage) == LOW ? HIGH : LOW);
est beaucoup mieux que digitalWrite(ledChauffage, !digitalRead(ledChauffage));
Comme exprimé plus haut, si d'aventure l'équipe Arduino adopte pour les AVR les types énumérés et nouvelles signature des fonctions pinMode(), digitalWrite(), digitalRead() qu'ils ont proposés:
typedef enum {
LOW = 0,
HIGH = 1,
CHANGE = 2,
FALLING = 3,
RISING = 4,
} PinStatus;
typedef enum {
INPUT = 0x0,
OUTPUT = 0x1,
INPUT_PULLUP = 0x2,
INPUT_PULLDOWN = 0x3,
} PinMode;
void pinMode(pin_size_t pinNumber, PinMode pinMode);
void digitalWrite(pin_size_t pinNumber, PinStatus status);
PinStatus digitalRead(pin_size_t pinNumber);
Ça change tout en C++: le type sous jacent de HIGH et LOW ne sera plus un nombre sur lequel les promotions sont applicables, l'usage de NOT (!
) sur ce type n'est pas défini à moins de surcharger l'opérateur.
S'ils venaient à faire cette modification, l'écriture avec l'opérateur ternaire restera correcte alors que le petit "hack" en operation booléenne arrêtera la compilation.
Ça cassera pas mal de code et donc je pense que c'est pour cela qu'ils ne l'ont pas encore fait.