我的if语句有什么问题?

时间:2015-10-04 11:40:31

标签: if-statement pascal freepascal

我现在正在尝试探索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 *)

我尝试删除beginend,但发生了同样的错误。这是编译器错误吗?

P.S。我在案例陈述中这样做。但我认为这不重要。

1 个答案:

答案 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;

第二个样本更容易阅读和理解,不是吗?

删除beginend时,代码无效,因为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?

如果在DoSmth3not (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;

现在代码行为很明显。