What is wrong with my if-statement?

做~自己de王妃 提交于 2019-11-27 16:09:19

; 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.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!