[NAME] ALL.dao.tutorial.controls [TITLE] Dao Constrol Structures [DESCRIPTION] 0.1 If-Else 当某条件表达式值为真时,执行一块代码: 1 if( expr1 ){ 2 block1; 3 }elif( expr2 ){ 4 block2; 5 }else{ 6 block3; 7 } 如果条件表达式 expr1的值为真, block1将被执行; 否则如条件 expr2为真, block2被执行; 否 则执行 block3。可使用零个或多个 elseif / elif, 和零个或一个 else。 1 if( 2 > 1 ) io.writeln("2 is larger than 1.") 0.2 For 道语言支持多种形式的for循环,最方便使用的是下面这种, 1 for( 变量 = 初值 : 步长 : 终值 ){ 2 代码; 3 } 循环将从 变量=初值开始执行,然后每次循环后, 变量的值按 步长 增加,直到 变量的值变得大于 终值时终止循环。 这里 步长可以省略,其缺省值是1。 初值, 步长和 终值总是在循环开始前被计 算。 C/C++类型 for循环: 1 for( init; condition; step ){ 2 block; 3 } for语句块的执行顺序是这样的: 1. 执行循环初始表达式 init;转到3; 2. 执行 step; 3. 执行条件表达式 condition; 4. 检查 condition的值:如为真,转到5,否则转到6; 5. 执行 block;转到2; 6. 终止循环,开始执行循环体后面的语句。 一般情况下,C/C++类型 for循环等价于下面的 while循环: 1 init; 2 while( condition ){ 3 block; 4 step; 5 } 但如果 block包含一个不被其他循环语句包含的 skip语句,那么上面这个 while循环 与C/C++类型 for循环并不完全等价。因在 for循环体中, skip只跳过 block 块余下的部分,而在上面的 while 循环中, skip将同时跳过 step语句。 道语言也支持Python风格的 for-in循环: 1 for( item in list ){ 2 block; 3 } 关联表也可用在for-in循环中,这里 item将会是一对键与值, 1 for( item in a_map ){ 2 block; 3 } 在一个for-in循环中可以使用多个in语句,但那些列表或关联表必须含有相同个数的元素, 否则, 程序将抛出例外, 1 for( item1 in list1; item2 in list2; ... ){ 2 block; 3 } 例子, 1 for( i=0; i<3; i++ ){ 2 io.writeln( i ); 3 } 4 5 hash = { "b" => 11, "a" => 22, "e" => 33, "c" => 44 }; 6 for( a in hash.key(); b in hash.value(); c in {1 : 1 : hash.size()-1 } ){ 7 #if a == "a" break 8 io.writeln( a, "\t", b, "\t", c ); 9 } 这个例子抛出了一个例外,因为最后那个列表的元素数目比其他第一个列表少一。 0.3 While 当某条件表达式值为真时, 反复执行一块代码: 1 while( expr ){ 2 block; 3 } 如果条件表达式 expr值为真,反复执行 block直到表达式 expr值为假。 1 i = 0; 2 while( i < 5 ){ 3 io.writeln( i ); 4 i ++; 5 } 0.4 Do-While 1 do{ 2 block; 3 } while ( condition ) 执行代码块 block, 然后在条件表达式式 condition为真 的情况下重复执行 block。 0.5 Switch-Case Switch-case开关控制可基于一个表达式的值选择相应的代码块执行。它可以用来方便地实现的分支 控制。 1 switch( exprs ){ 2 case C1 : block1 3 case C2 : block2 4 case C3 : block3 5 ... 6 default: block0 7 } 如果表达式 exprs的值等于某个 case语句的 Ci,代码块 blocki将被执行。 这里 Ci必须是常量, 可以是不同类型的值。与C/C++不同的是,代码块 blocki被执行后, 程序执行将跳到 switch块外, 因此这里不需要象C/C++里那样使用 break语句来显示跳出 switch块。 如果你需要对不同的 case值都执行同一块代码,你仅需将那些 case值放在一起: 1 switch( value ){ 2 case C1, C2, C3 : 3 block3 4 ... 5 default: block0 6 } 在这种情况下, case值 C1,C2,C3将对应于同一代码块 block3。 1 a = "a"; 2 switch( a ){ 3 case 1, "a" : io.write("case 1 or a"); 4 default : io.write("case default"); 5 } 道语言的switch-case结构还允许使用值区间作为case, 这样当switch值属于这个区间时,此case块 将被执行。 需要注意的是,如果switch值属于多个相互重叠的区间, 那么对应下界最小的区间的 case块将被执行。 1 switch( 5 ){ 2 case 1 ... 5 : io.writeln( 'case 1-5' ); 3 case 5 ... 10 : io.writeln( 'case 5-10' ); 4 case 10 ... 11 : a = 1; 5 } 0.6 Break and Skip