Question

I'm confused on need for braces after IF() expression. When using IF(){...}ELSE{...} I'm used to using braces around both IF and ELSE blocks. But when I use no ELSE block it works with no braces and fails with braces:
works: IF()...
fails: IF(){...}
Example below, this is for a microcontroller

#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
Was it helpful?

Solution

A single statement follows the if. If you need multiple statements, they must be combined into a single compound statement.

if (input(3) == 1)
    high(14);
pause(50);
low(14);
pause(50);

executes both pause functions and low regardless of what input returns. Where you put the newlines does not affect how C parses the code. You need braces to combine the 4 function calls into a single compound statement:

if (input(3) == 1) {
    high(14);
    pause(50);
    low(14);
    pause(50);
}

The absence or presence of an else clause does not change anything, except that

if (input(3) == 1)
    high(14);
pause(50);
else ...

would result in an error, since the else is not joined to any if statement; the if concludes with the single statement high(14), and the pause(50) is a separate statement altogether, so the else is out of place.

OTHER TIPS

Both the if and else clauses control only the immediately following statement. Your code, indented correctly, is actually:

#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

The fact that two statements may be on the same line is irrelevant; the if still only controls a single statement. If you want to control two or more statements, you must wrap them in a "compound statement" by using braces:

#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

Since the else must immediately follow the if's controlled statement, inserting it after your two-statement line without braces won't work.

The way if works is if (condition) stmt1;; if you want more than 1 statement to be executed if the condition is true, you need to wrap them up with {}. I suspect when you say your code "works" with no braces, you mean it compiles, but the execution will be quite different than if you wrapped the 4 statements in {}. Recall that C doesn't give a fig about indentation.

The identation (number of spaces or newlines) has absolutelly no meaning to the compiler. Without braces, only the very next instruction is covered by the if.

if (a)
    DoSomething(); DoSomethingelse();
    MoreToDo();

Actually means:

if (a)
{
    DoSomething();
}
DoSomethingelse();
MoreToDo();

Tipp: Always start a newline after ";", Improves readability. Some people also suggest to always use the braces, that further reduces errors such as this one.

If input(3)==1 then high(14); will be called.

But pause(50);low(14);pause(50); will always be executed despite the return from input(3)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top