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