What is wrong with my if-statement?

前端 未结 1 1233
终归单人心
终归单人心 2020-12-04 01:58

I am now trying to explore pascal. And I ran into some compiler errors. I wrote a if else if statement like this:

  if ((input = \'y\') or (input = \'Y\')) t         


        
相关标签:
1条回答
  • 2020-12-04 02:40

    ; is not allowed before else in the majority of cases.

      if ((input = 'y') or (input = 'Y')) then
        begin
          writeln ('blah blah');
        end
      else if ((input = 'n') or (input = 'N')) then
        begin
          writeln ('blah');
        end
      else
        begin
          writeln ('Input invalid!');
        end;
    

    will compile. But... Prefer using begin ... end brackets to avoid misunderstanding of code in complicated if then else statements. something like this will be better:

      if ((input = 'y') or (input = 'Y')) then
      begin
        writeln('blah blah');
      end
      else
      begin
        if ((input = 'n') or (input = 'N')) then
        begin
          writeln('blah');
        end
        else
        begin
          writeln('Input invalid!');
        end;
      end;
    

    The second sample is much easier to read and understand, isn't it?

    The code does not work when you remove begin and end because there is a semicolon before else. This will compile without errors:

      if ((input = 'y') or (input = 'Y')) then
        writeln('blah blah')
      else
      begin
    
      end;
    

    Appended on comment of @lurker

    Please, see the following example without begin ... end brackets.

      if expr1 then
        DoSmth1
      else if expr2 then
        if expr3 then
          DoSmth2
        else
         DoSmth3;//Under what conditions is it called?
    

    It is not clearly seen here, if DoSmth3 is called on not (expr2) or (expr2) and (not (expr3)). Though we can predict the compiler behaviour in this sample, the more complicated code without begin ... end becomes subect to mistakes and is difficult to read. See the following code:

      //behaviour 1
      if expr1 then
        DoSmth
      else if expr2 then
      begin
        if expr3 then
          DoSmth
      end
      else
        DoSmth;
    
      //behaviour 2
      if expr1 then
        DoSmth
      else if expr2 then
      begin
        if expr3 then
          DoSmth
        else
          DoSmth;
      end;
    

    Now the code behavior is obvious.

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