C language: if() with no else(): using braces fails

前端 未结 5 938
后悔当初
后悔当初 2021-01-29 06:47

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

相关标签:
5条回答
  • 2021-01-29 06:51

    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.

    0 讨论(0)
  • 2021-01-29 07:00

    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)

    0 讨论(0)
  • 2021-01-29 07:04

    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.

    0 讨论(0)
  • 2021-01-29 07:07

    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.

    0 讨论(0)
  • 2021-01-29 07:14

    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.

    0 讨论(0)
提交回复
热议问题