Je suis confus sur le besoin d’accolades après l’expression IF (). Lorsque j’utilise IF () {…} ELSE {…}, je suis habitué à utiliser des accolades autour des blocs IF et ELSE. Mais lorsque je n’utilise pas de bloc ELSE, cela fonctionne sans accolades et échoue avec les accolades:
fonctionne: IF () …
échoue: IF () {…}
Exemple ci-dessous, ceci concerne un microcontrôleur
#include "simpletools.h" int main() { while(1) { print("button = %d\n", input(3)); if(input(3) == 1) //works if no braces high(14); pause(50); low(14); pause(50); } //while } // main
Une seule déclaration suit le if
. Si vous avez besoin de plusieurs déclarations, elles doivent être combinées en une seule instruction composée .
if (input(3) == 1) high(14); pause(50); low(14); pause(50);
exécute les deux fonctions de pause
et low
indépendamment de l’ input
retournée. L’emplacement des nouvelles lignes n’affecte pas la manière dont C parsing le code. Vous avez besoin d’accolades pour combiner les 4 appels de fonction en une seule instruction composée:
if (input(3) == 1) { high(14); pause(50); low(14); pause(50); }
L’absence ou la présence d’une clause else
ne change rien, sauf que
if (input(3) == 1) high(14); pause(50); else ...
entraînerait une erreur, puisque le else
n’est pas associé à une instruction if
; le if
termine par la déclaration unique high(14)
, et la pause(50)
est une déclaration distincte, le else
est donc déplacé.
Les clauses if et else ne contrôlent que l’instruction suivante. Votre code, correctement mis en retrait, est en réalité:
#include "simpletools.h" int main() { while(1) { print("button = %d\n", input(3)); if(input(3) == 1) high(14); pause(50); low(14); pause(50); } //while } // main
Le fait que deux déclarations puissent être sur la même ligne n’est pas pertinent; le si ne contrôle toujours qu’une seule déclaration. Si vous souhaitez contrôler deux ou plusieurs instructions, vous devez les envelopper dans une “instruction composée” à l’aide d’accolades:
#include "simpletools.h" int main() { while(1) { print("button = %d\n", input(3)); if(input(3) == 1) { high(14); pause(50); } else { low(14); pause(50); } } //while } // main
Étant donné que le paramètre else doit suivre immédiatement l’instruction contrôlée if, l’insérer après votre ligne à deux instructions sans accolades ne fonctionnera pas.
Le chemin si fonctionne est if (condition) stmt1;
; si vous souhaitez exécuter plus d’une instruction si la condition est vraie, vous devez les envelopper avec {}. J’imagine que lorsque vous dites que votre code “fonctionne” sans accolades, vous voulez dire qu’il comstack, mais l’exécution sera très différente de celle que vous auriez encapsulée dans les 4 instructions {}. Rappelez-vous que C ne donne pas la moindre idée de l’indentation.
L’identification (nombre d’espaces ou de nouvelles lignes) n’a absolument aucune signification pour le compilateur. Sans accolades, seule l’instruction suivante est couverte par le if.
if (a) DoSomething(); DoSomethingelse(); MoreToDo();
Signifie en réalité:
if (a) { DoSomething(); } DoSomethingelse(); MoreToDo();
Conseil: commencez toujours une nouvelle ligne après “;”, améliore la lisibilité. Certaines personnes suggèrent également de toujours utiliser les accolades, ce qui réduit davantage les erreurs telles que celle-ci.
Si input(3)==1
alors high(14);
sera appelé.
Mais pause(50);low(14);pause(50);
sera toujours exécuté malgré le retour de l’ input(3)