-1

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
OldProgrammer
  • 12,050
  • 4
  • 24
  • 45
Playing with GAS
  • 565
  • 3
  • 10
  • 18

5 Answers5

4

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.

chepner
  • 497,756
  • 71
  • 530
  • 681
2

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.

keshlam
  • 7,931
  • 2
  • 19
  • 33
0

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.

Scott Hunter
  • 48,888
  • 12
  • 60
  • 101
0

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.

PMF
  • 14,535
  • 3
  • 23
  • 49
-1

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)

Ed Heal
  • 59,252
  • 17
  • 87
  • 127