第六章 Caché 命令大全 DO WHILE 命令

第六章 Caché 命令大全 DO WHILE 命令

在条件存在时执行代码。

重点

  1. DO WHILE 命令无法用点语法。
  2. 至少循环一次。
  3. DO WHILE 里可以写Lable
  4. quit,continue,retrun退出区别

大纲

DO {code} WHILE expression,...

参数

  • code 用大括号括起来的CachéObjectScript命令块。
  • expression 布尔测试条件表达式或布尔测试条件表达式的逗号分隔列表。

描述

DO WHILE执行代码,然后计算表达式。如果表达式的计算结果为True,则DO WHILE循环并重新执行代码。如果表达式不为true,则不重新执行代码,并执行Do While后面的下一个命令。

请注意,Do While始终以面向块的形式编写。要执行的代码放在doWhile关键字之间,并用大括号括起来。

左大括号或右大括号可以出现在其自己的代码行上,也可以与命令显示在同一行上。左大括号或右大括号甚至可能出现在第1列中(但不建议这样做)。建议的编程实践是缩进大括号以指示嵌套代码块的开始和结束。左花括号前后不需要空格。右大括号前后不需要空格,包括无参数命令后的大括号。

DO WHILE(与DO命令无直接关系)不会创建新的执行级别。对执行级别敏感的命令(如NEWSET $ZTRAP)在DO WHILE循环期间调用,在循环结束后仍然有效。

参数

code

一个或多个CachéObjectScript命令的块。代码块可能跨越几行。代码块用大括号括起来。代码块内的命令和注释以及命令内的参数可以通过一个或多个空格和/或行回车符彼此分开。但是,与所有CachéObjectScript命令一样,每个命令关键字必须与其第一个参数仅用一个空格分隔。

expression

一种测试条件,可以采用单个表达式或逗号分隔的表达式列表的形式。对于表达式列表,Caché按从左到右的顺序计算各个表达式。如果遇到假的表达式,它将停止求值。如果所有表达式的计算结果都为true,则Caché重新执行代码命令DO WHILE重复执行,测试每个循环的表达式。如果任何表达式的计算结果为False,则Caché将忽略任何剩余的表达式,并且不循环。它在DO WHILE之后执行下一个命令。

示例

以下示例首先显示表达式为TRUE的DO WHILE,然后显示表达式为FALSE的DO WHILE。当expression为false时,代码块将执行一次。

/// d ##class(PHA.TEST.Command).TestDoWhileTrue()
ClassMethod TestDoWhileTrue()
{
	SET x=1
	DO {
		WRITE !,"Looping",x
		SET x=x+1
	} WHILE x<10
	WRITE !,"DONE"
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileTrue()
 
Looping1
Looping2
Looping3
Looping4
Looping5
Looping6
Looping7
Looping8
Looping9
DONE

此程序写入Looping1Looping9,然后执行。

/// d ##class(PHA.TEST.Command).TestDoWhileFalse()
ClassMethod TestDoWhileFalse()
{
	SET x=11
	DO {
		WRITE !,"Looping:",x
		SET x=x+1
		WRITE !,"Looping x + 1:",x
	} WHILE x<10
	WRITE " DONE"
}

DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileFalse()
 
Looping:11
Looping x + 112 DONE

此程序编写Looping11完成。

注意

DO WHILEWHILE

DO WHILE命令执行循环一次,然后测试表达式。WHILE命令在执行循环之前测试表达式。

DO WHILECONTINUE

DO WHILE命令的代码块中,遇到CONTINUE命令会导致执行立即跳转到WHILE关键字。然后,DO WHILE命令对WHILE表达式测试条件求值,并基于该求值确定是否重新执行代码块循环。因此,CONTINUE命令对执行的影响与到达代码块的右大括号完全相同。

DO WHILE, QUIT, 和 RETURN

代码块中的QUIT命令结束DO WHILE循环,并将执行转移到WHILE关键字后面的命令,如下面的示例所示:

/// d ##class(PHA.TEST.Command).TestDoWhileLoop()
ClassMethod TestDoWhileLoop()
{
	SET x=1
	DO {
		WRITE !,"Looping",x 
		QUIT:x=5
		SET x=x+1 
	} WHILE x<10 
	WRITE !,"DONE"
}

DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileLoop()
 
Looping1
Looping2
Looping3
Looping4
Looping5
DONE

此程序写入Looping1Looping5,然后执行。

Do While代码块可以嵌套。也就是说,DO WHILE代码块可以包含另一个控制流循环(另一个DO WHILEFORWHILE代码块)。内嵌套循环中的QUIT会中断内循环,转到下一个封闭的外循环。下面的示例显示了这一点:

/// d ##class(PHA.TEST.Command).TestDoWhileNested()
ClassMethod TestDoWhileNested()
{
	SET x = 1,y = 1
	DO {
		WRITE "外部循环 ",!
		DO {
			WRITE "内部循环 " 
			WRITE " y=",y,!
			QUIT:y=7
			SET y = y + 2 
		} WHILE y < 100
		WRITE "返回外部循环 x=",x,!!
		SET x = x + 1 
	} WHILE x < 6 
	WRITE "Done"
}

DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileNested()
外部循环
内部循环  y=1
内部循环  y=3
内部循环  y=5
内部循环  y=7
返回外部循环 x=1
 
外部循环
内部循环  y=7
返回外部循环 x=2
 
外部循环
内部循环  y=7
返回外部循环 x=3
 
外部循环
内部循环  y=7
返回外部循环 x=4
 
外部循环
内部循环  y=7
返回外部循环 x=5
 
Done

可以在任何时候使用RETURN终止例程的执行,包括从DO WHILE循环或嵌套循环结构中终止。Return始终退出当前例程,如果没有调用例程,则返回调用例程或终止程序。无论是否从代码块中发出,Return的行为始终相同。

/// d ##class(PHA.TEST.Command).TestDoWhileNestedReturn()
ClassMethod TestDoWhileNestedReturn()
{
	SET x = 1,y = 1
	DO {
		WRITE "外部循环 ",!
		RETURN
		DO {
			WRITE "内部循环 " 
			WRITE " y=",y,!
			QUIT:y=7
			SET y = y + 2 
		} WHILE y < 100
		WRITE "返回外部循环 x=",x,!!
		SET x = x + 1 
	} WHILE x < 6 
	WRITE "Done"
}

DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileNestedReturn()
外部循环
 

DO WHILEGOTO

代码块内的GOTO命令可以将执行定向到循环外部的标签,从而终止循环。(LABEL有时也称为TAG。)。代码块内的GOTO命令可以将执行定向到同一代码块内的标签。GOTO可用于退出嵌套代码块。GOTO的其他用法虽然受支持,但不推荐使用。

以下示例使用GOTO退出DO WHILE循环:

/// d ##class(PHA.TEST.Command).TestDoWhileGoto()
ClassMethod TestDoWhileGoto()
{
mainloop
	DO {
		WRITE !,"在无限DO WHILE循环中"
		GOTO label1
		WRITE !,"这不应显示"
	} WHILE 1=1
	WRITE !,"这不应显示"
label1
	WRITE !,"转到label1并退出"
	QUIT
}
DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileGoto()
 
在无限DO WHILE循环中
转到label1并退出

下面的示例使用GOTODO WHILE循环内传输执行:

/// d ##class(PHA.TEST.Command).TestDoWhileGotoLoop()
ClassMethod TestDoWhileGotoLoop()
{
mainloop ; 代码块内的GOTO示例
	SET x=1
	DO {
		WRITE !,"在DO WHILE循环中"
		GOTO label1
		WRITE !,"这不应显示"
label1
		WRITE !,"GOTO之后仍在DO WHILE循环中"
		SET x=x+1
		WRITE !,"x= ",x
	} WHILE x<3
	WRITE !,"DO WHILE循环完成"
}

DHC-APP>d ##class(PHA.TEST.Command).TestDoWhileGotoLoop()
 
在DO WHILE循环中
GOTO之后仍在DO WHILE循环中
x= 2
在DO WHILE循环中
GOTO之后仍在DO WHILE循环中
x= 3
DO WHILE循环完成

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/107174583
今日推荐