多值条件判断(case 语句)

单一表达式多分支判断

如果需要根据同一个表达式的不同取值执行不同逻辑,case .. of .. end 语句会非常适用。

case SomeValue of
  0: DoSomething;
  1: DoSomethingElse;
  2: begin
       IfItsTwoThenDoThis;
       AndAlsoDoThis;
     end;
  3..10: DoSomethingInCaseItsInThisRange;
  11, 21, 31: AndDoSomethingForTheseSpecialValues;
else
  DoSomethingInCaseOfUnexpectedValue;
end;Code language: JavaScript (javascript)

else 分支为可选,作用等同于 C 系语言 switch 里的 default

如果所有分支都不匹配且未写 else,则不会执行任何代码。

如果你熟悉 C 类语言并对比 switch 语句,会发现 Pascal 的 case 不存在自动穿透(fall-through),这是 Pascal 刻意设计的优势。 你无需手动添加 break 语句;每次执行最多只会进入一条 case 分支,执行完毕直接跳出整个 case 结构。

5 种合法匹配写法

case num of
  5: Writeln('等于5');                  // 单个数值
  1,3,5: Writeln('匹配1、3、5其一');    // 多数值逗号分隔
  10..20: Writeln('10到20区间');        // 连续数值范围
  'a'..'z': Writeln('小写字母');        // 字符区间也支持
else
  Writeln('无匹配值');
end;Code language: JavaScript (javascript)

多语句分支必须加 begin..end

case n of
  2: begin
    Writeln('分支2');
    Writeln('执行多条代码');
  end;
end;Code language: JavaScript (javascript)

下面是一个例子,输入1-128的ASCII数字,然后根据数字,判断输入的数字对应的ascii码

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

// 封装过程:直接传入ASCII数值0-128判断分类
procedure JudgeAsciiCode(code: Integer);
begin
  case code of
    // 1. 单一数值匹配 + 多行begin end(回车ASCII=13)
    13: begin
      Writeln('======== 特殊回车键 ========');
      Writeln('ASCII码:13 回车控制符');
      Writeln('============================');
    end;

    // 2. 多离散值逗号匹配:0-12、14-31 所有普通控制符
    0,1,2,3,4,5,6,7,8,9,10,11,12,14,15..31:
      Writeln('类型:控制字符');

    // 3. 区间匹配:数字 0~9 ASCII 48~57
    48..57: Writeln('类型:数字 0-9');

    // 区间:大写字母 A-Z
    65..90: Writeln('类型:大写英文字母 A-Z');
    // 区间:小写字母 a-z
    97..122: Writeln('类型:小写英文字母 a-z');

    // 4. else 默认分支 + 多行begin end(符号)
  else
    begin
      Writeln('类型:标点/符号');
      Writeln('当前输入ASCII编码:', code);
    end;
  end;
end;

var
  asciiNum: Integer;
begin
  Write('请输入0~128之间的ASCII数字:');
  ReadLn(asciiNum);

  // 限制输入范围
  if (asciiNum >= 0) and (asciiNum <= 128) then
    JudgeAsciiCode(asciiNum)
  else
    Writeln('输入超出0~128范围,无效!');

  ReadLn;
end.Code language: PHP (php)

关于ascii码,读者可以查阅如下文章了解.ASCII table – Table of ASCII codes, characters and symbols

发表回复

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