if条件判断

使用 if .. thenif .. then .. else,在条件成立时执行对应代码。 和 C 系语言不同:Pascal 的条件表达式不需要用括号包裹

var
  A: Integer;
  B: boolean;
begin
  // 条件成立仅执行单条语句,无需 begin end
  if A > 0 then
    DoSomething;

  // 条件成立要执行多条语句,必须用 begin end 包裹成代码块
  if A > 0 then
  begin
    DoSomething;
    AndDoSomethingMore;
  end;

  // 单语句 if-else 结构
  if A > 10 then
    DoSomething
  else
    DoSomethingElse;

  // 和上面代码逻辑完全等价:把判断结果存入布尔变量再使用
  B := A > 10;
  if B then
    DoSomething
  else
    DoSomethingElse;
end;Code language: JavaScript (javascript)

else 匹配规则

else 会和离它最近、尚未匹配 else 的 if 绑定。 下面这段代码逻辑符合预期:

if A <> 0 then
  if B <> 0 then
    AIsNonzeroAndBToo
  else
    AIsNonzeroButBIsZero;Code language: HTML, XML (xml)

这里的 else 属于内层 if B <> 0

上面这种无代码块包裹的嵌套 if 语法合法,但可读性差。 推荐用 begin … end 把内层嵌套整体包裹,代码逻辑边界清晰;就算缩进排版混乱,阅读者也能一眼分清归属,修改增删分支时更不容易写出 bug。

优化规范写法:

if A <> 0 then
begin
  if B <> 0 then
    AIsNonzeroAndBToo
  else
    AIsNonzeroButBIsZero;
end;Code language: HTML, XML (xml)
  • if 后面的判断条件不用括号(C/C++/Java 必须加括号,Pascal 相反);
  • then 后只有一行代码:可省略 begin end;多行代码必须包裹;
  • else 就近匹配内层 if,嵌套建议强制加块消除歧义;
  • 比较表达式(如 A>10)可直接赋值给布尔变量。

下面是一个可运行的例子:分数评级完整示例

逻辑规则:

  • ≥90 → A
  • ≥80 且 <90 → B
  • ≥60 且 <80 → C
  • <60 → D
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ScoreLevel;

var
  score: Integer;
begin
  Write('请输入考试分数:');
  ReadLn(score);

  if score >= 90 then
    Writeln('等级:A')
  else if score >= 80 then
    Writeln('等级:B')
  else if score >= 60 then
    Writeln('等级:C')
  else
    Writeln('等级:D');

  ReadLn;
end.Code language: PHP (php)

编译后运行

请输入考试分数:96
等级:A

程序会提示你输入分数,输入后,会输出等级。

非英文下面可能会乱码,可以增加这句:{$codepage utf8}

也可以把等级获取封装成一个函数。

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ScoreLevelFunc;

function GetLevel(s: Integer): string;
begin
  if s >= 90 then
    Result := 'A'
  else if s >= 80 then
    Result := 'B'
  else if s >= 60 then
    Result := 'C'
  else
    Result := 'D';
end;

var
  score: Integer;
begin
  Write('Your score:');
  ReadLn(score);
  Writeln('Your level:', GetLevel(score));
  ReadLn;
end.Code language: PHP (php)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注