do—while
语句是实现“直到型”循环结构。一般形式如下:
do
{
语句
1
}while(
表达式
)
上面的语句是这样的执行的,先执行一次语句
1
,然后判断表达式的值,如果表达式的值为真,也就是非零时,返回重新执行语句
1
,如此反复,直到表达式的值等于
0
为止。这个表达式与前面一个
while
语句的区别,就是表达式值的判断和语句
1
执行先后的问题。前面
while
语句先判断后执行语句
1
,而
do—while
语句是先执行后判断。在
LCC
里是通过下面的函数
dostmt
来实现这个语句的处理。
#018 case DO:
#019 dostmt(genlabel(3), swp, lev + 1);
#020 expect(';');
#021 break;
而
dostmt
函数的代码如下:
#001 static void dostmt(int lab, Swtch swp, int lev)
#002 {
#003 refinc *= 10.0;
#004 t = gettok();
#005 definelab(lab);
#006 statement(lab, swp, lev);
#007 definelab(lab + 1);
#008 expect(WHILE);
#009 expect('(');
#010 definept(NULL);
#011 walk(conditional(')'), lab, 0);
#012 if (findlabel(lab + 2)->ref)
#013 definelab(lab + 2);
#014 }
第
4
行是获取下一个记号。
第
5
行是定义第一个标号。
第
6
行是处理
do—while
中的语句。
第
7
行是定义第二个标号。
第
8
行是测试
WHILE
是否存在。
第
11
行处理条件表达式,如果条件不等于
0
就跳转到第一个标号那里处理。
第
12
行是查看是否需要生成第三个标号,主要是在循环里跳出来的语句准备的。
生成的代码形式如下:
标号
1
:语句
1
标号
2
:如果
条件表达式不等于
0
就跳转到标号
1
运行
标号
3
:
它与
while
循环的区别,就是少了第一个跳转指令的生成。