Langage C: if () sans else (): échec de l’utilisation des accolades

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)