switch 选择结构
switch 运算符提供了从多个算法选项中选择一个的能力。通常,选项的数量明显多于两个,否则的话,使用 if/else 语句会更简单。理论上,if/else 语句链条在很多情况下(但不是所有情况下)实现与 switch 等效的功能。switch 的一个重要特征是基于整数表达式值(通常是一个变量)选择(识别)所有选项。
一般情况下,switch 语句如下所示:
switch ( expression )
|
语句头文件以 switch 关键字开头。后面必须跟带圆括号的表达式。还必须有带花括号的代码块。
应将通过计算表达式获得的整数值指定为常量,并在 case 关键字后面指定。常量是指任何 整数类型的字面量,例如,int(10, 123),ushort(字符 'A'、's'、'*' 等),或者 enum 元素。这里常量不允许是实数、变量或表达式。
可能有许多这种 case 选项,也可能根本没有,这用带索引 opt(n)的半圆括号表示。所有变量必须有唯一常量(不重复)。
对于用 case 声明的每个备选项,在冒号后必须编写一个语句,如果表达式的值等于相应的常量,则执行该语句。同样,语句可以是简单语句,也可以是复合语句。此外,也可以编写几个简单的语句,不用花括号括起来:这些语句仍将作为一个组执行(复合语句)。
这些语句中的后面可以带有 break 跳转语句。
如果有一个 break,则在执行了 case 分支前面的语句之后,switch 语句退出,即控制权被转移到 switch 下面的语句。
如果没有 break,下一个分支或几个分支 case 的语句继续执行,即直到遇到 break 或直到 switch. 块结尾。这被称为“贯穿执行”。
因此,switch 语句不仅允许将算法执行流分解成几个替代项,还允许将它们组合起来,而 if 运算符不支持这一特性。另一方面,与 if 不同,在 switch 语句中,您不能选择一个值范围作为激活替代项的条件。
default 关键字允许您设置默认的算法变量,即除了所有 cases 常量之外的任何其他表达式值。default 选项要么不存在,要么仅有一个。
可以按任意顺序列 case 常量和 default。
即使还没有 default 分支的算法,也建议将其显式设置为空,即包含 break。default 为空将提醒你和其他程序员存在其他选项只是不太重要,否则,default 分支必定会报错。
具有不同常量的多个 case 变量可以从上到下(或从左到右)逐个列出(不带语句),但最后一个必须包含语句。这种组合的 cases 在图中通过索引 (i)表示。
以下是最简单也是最没有实际用处的 switch:
switch(0)
|
我们考虑一个更复杂的不同模式的例子 (StmtSelectionSwitch.mq5)。其中,switch 运算符放置在循环结构内部,以显示其工作如何由控制变量 i 的值决定。
for(int i = 0; i < 7; i++)
|
-1 选项将会失败,因为循环结构在从 0 到 6 的范围(包含 0 和 6)内更改变量 i。当 i 等于 0 时,default 分支被触发。当 i 等于 6 时,它也会取得控制权。所有其他可能的 i 值根据相应的 case 指令进行分配。与此同时,分支 2 之后没有 break 语句,因此除了选项 2 的代码,选项 3 和 4 的代码也将被执行(在这种情况下,始终建议保留一个注释,说明这是有意为之)。
分支 3和分支 4 有一个共同的语句块。但是这里需要注意的是,如果您想在一个 case 选项中声明一个局部变量,需要将语句放在一个嵌套的复合块内 ('{...}')。这里的 local_var 变量就是以这种方式定义的。
需要说明的是,在 default 分支中没有 break 语句。这个语句是多余的,因为在这种情况下 default 都是最后写的。但是,大多数程序员建议在任何选项(即使是最后一个)的末尾插入 break,因为在后续修改代码的过程中,它可能不再是最后一个,这时候又很容易忘记添加 break,那么就很可能导致程序逻辑出现错误。
如果在 switch 中没有 default,并且头表达式与任何 case 常量都不匹配,则跳过整个 switch。
作为脚本执行的结果,我们将在日志中收到以下消息:
Default: 0
|