What is wrong with my if-statement?

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

Leave a Comment