IF中使用GOTO
- 如果在IF代码块中使用GOTO,注意以下死循环。
ClassMethod IF5() { s x = 1 Loop if x >= 1{ w "无限循环",! s x = x + 1 goto Loop } w !,"结束" } 复制代码
循环命令
For命令
FOR是面向块的命令。通常,它由一个计数器和一个用大括号括起来的可执行代码块组成。此代码块的执行次数由计数器确定,计数器在每个循环体的顶部进行测试。for命令不指定递增计数器。它可以是无参数的(无限循环直到退出),也可以指定一个表达式作为其参数(循环一次)。
FOR var=forparameter { code } F var=forparameter { code } FOR var=forparameter1,forparameter2,... { code } F var=forparameter1,forparameter2,... { code } 复制代码
expr start:increment start:increment:end 复制代码
- 不带参数的for无限执行循环代码块,直到由代码块内的命令退出。重复括号内的命令,直到遇到退出循环的Quit、Return或GOTO命令。
ClassMethod For(x) { for { w "x=", x,! s x = x - 1 q:(x = 3) } q "结束" } 复制代码
- 错误也会中断for循环。此for循环由CATCH块捕获的被零除错误退出:
ClassMethod For1(x) { try { for { s y = 4 / x w "4/", x, "=", y,! s x = x - 1 } w "FOR代码块之后的下一个命令" } catch exp { w !,"异常处理模块",! if 1 = exp.%IsA("%Exception.SystemException") { w "Name: ", exp.Name,! w "Location: ", exp.Location,! w "Code: ", exp.Code }else { WRITE "其他异常",! } } ret "结束" } 复制代码
- 使用 FOR var=expr时,执行for循环的次数等于expr中逗号分隔值的次数。
ClassMethod For2() { s val = 4 for num = val { w num*3,! } q "结束" } 复制代码
- for的参数设置为值列表的变量。
ClassMethod For3() { for color = "red", "black", "white", "green" { w color,! } q "结束" } 复制代码
- 使用 FOR var=start:increment:end ,参数START、INCREMENT和END分别指定起始值、增量值和结束值。
- 当第一次进入循环时,它会将起始值分配给var,并将var值与结束值进行比较。如果变量值小于结束值(如果是负增量值,则大于该值),则执行循环命令。然后,它使用增量值更新var值。(如果使用负增量,则var值会递减。)
- 循环继续执行,直到var值的增量超过结束值(或者直到遇到QUIT、RETURN或GOTO)。为了防止var超过end,Caché取消变量赋值并结束循环执行。如果增量导致var值等于结束值,则Caché最后一次执行for循环,然后终止该循环。
ClassMethod For5() { s str = "The darkness of the night is not black" s len = $length(str) for i = 1 : 1 : len - 1 { w i," ",$e(str, i),! } q "结束" } 复制代码
- 使用 FOR var=start:increment,在这种形式的for命令中,没有结束值;循环必须包含QUIT、RETURN或GOTO命令才能终止循环。
ClassMethod For6() { for i(1) = 0 : 7 { q:$length(i(1))=3 w i(1),! } } 复制代码
- 使用 FOR 多值参数,依次执行多个参数循环体。
ClassMethod For7() { for i = 1 : 1 : 10, 10 : 10 : 100, 100 : 100 : 1000 { w i,! } } 复制代码
- 点语法(不推荐,废弃结构),传统的FOR命令是面向行的。它执行的循环由在同一程序行中跟随它的命令组成。不使用花括号,并且行格式是固定的。
ClassMethod For8() { s color(1) = "red" s color(2) = "black" s color(3) = "white" s color(4) = "green" s ID = "" f s ID = $o(color(ID)) q:(ID = "") d .w "点语法:" _ color(ID),! s ID = "" for { s ID =$o(color(ID)) q:(ID = "") w "块语法:" _ color(ID),! } q "结束" } 复制代码
- 注意:经常犯错误的写法。
ClassMethod For4() { s color(1) = "red" s color(2) = "black" s color(3) = "white" s color(4) = "green" s ID = "" f ID = $o(color(ID)) q:(ID = "") d .w color(ID),! q "结束" }