循环命令

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第45天,点击查看活动详情

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 "结束"
}