我现在正在尝试探索pascal。我遇到了一些编译器错误。我写了一个if else if语句:
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;
它在第一个else
给我一个错误:
“;”预期但“ELSE”发现
我找了很多关于if语句的教程,他们就像我一样:
if(boolean_expression 1)then
S1 (* Executes when the boolean expression 1 is true *)
else if( boolean_expression 2) then
S2 (* Executes when the boolean expression 2 is true *)
else if( boolean_expression 3) then
S3 (* Executes when the boolean expression 3 is true *)
else
S4; ( * executes when the none of the above condition is true *)
我尝试删除begin
和end
,但发生了同样的错误。这是编译器错误吗?
P.S。我在案例陈述中这样做。但我认为这不重要。
答案 0 :(得分:10)
;
之前不允许 else
。
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;
将编译。
但是...首选使用begin
... end
括号,以避免对复杂的if then else
语句中的代码产生误解。
这样的事情会更好:
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;
第二个样本更容易阅读和理解,不是吗?
删除begin
和end
时,代码无效,因为else
之前有分号。这将编译没有错误:
if ((input = 'y') or (input = 'Y')) then
writeln('blah blah')
else
begin
end;
关于@lurker 的评论附加
请参阅以下示例,不要使用begin
... end
括号。
if expr1 then
DoSmth1
else if expr2 then
if expr3 then
DoSmth2
else
DoSmth3;//Under what conditions is it called?
如果在DoSmth3
或not (expr2)
上调用(expr2) and (not (expr3))
,则无法在此处清楚地看到。虽然我们可以预测此示例中的编译器行为,但没有begin
... end
的更复杂的代码会变成错误并且难以阅读。请参阅以下代码:
//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;
现在代码行为很明显。