单一表达式多分支判断
如果需要根据同一个表达式的不同取值执行不同逻辑,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
Previous: 逻辑、关系与按位运算符
Next: Pascal 枚举