if语句是计算机语言中最常见的逻辑控制语句,它实现了最基础的判断逻辑。
TCL语言中的if语句的两种语法如下:
(1):if expr1 ?then? body1 ?else? ?body2?
(2):if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?
第一种语法是单条件判断和单条件全域判断的形式。单条件判断是指只有一个判断条件,但是他可分为半域控制和全域控制两种。半域控制只包含一个if判断和其条件成立时执行的逻辑语句块,全域判断则在此基础上还包含了其条件不成立时需要执行的else逻辑语句块。
第二种语法则是if语句的一种多分支判断逻辑结构,它的每个判断分支逻辑都互斥,同时在语法上它也有一个判断顺序的存在。
这两种语法中then关键字都是可以省略的。then关键字除了从自然语义上更让人易懂外,从功能上没有实际的价值。这也许是设计者特意增加的,以便初学者能够更好的理解这个语法。
if语句实现的逻辑流程如下所示:
正如我们前面所描述的,if的多条件判断是有执行顺序的。接下来我们将模仿TCL解释器来解释执行if命令。
首先我们来看一段代码:
proc EvalIfCmd {ifcmd clevel} {
set res ""
set newifcmd ""
foreach ifblock $ifcmd {
if {$ifblock ne "then"} {
lappend newifcmd $ifblock
}
}
set elseblock ""
if {[lindex $newifcmd end-1] eq "else"} {
set elseblock [lindex $newifcmd end]
}
foreach {block1 block2 block3} $newifcmd {
if {$block1 ne "else"} {
if {[uplevel $clevel [list expr $block2]]} {
set res [uplevel $clevel "$block3"]
set elseblock ""
break
}
}
}
if {$elseblock ne ""} {
set res [uplevel $clevel $elseblock]
}
return $res
}
这段代码定义的函数实现了对if命令的解释执行。根据之前我们列举的两种if语句的语法规则,我们可以将if命令看做一个字符串列表(实际上所有的TCL命令我们都可以看做一个字符串列表)。这个时候我们将分析出一个规律,除了else和其对应的逻辑部分,其余部分我们在去除了then关键字之后,它实际上是每3个元素组成一个逻辑分支。于是我们先去除了if语句列表中的then关键字,然后通过foreach语句来三个三个的遍历我们if命令中的元素。
我们每次遍历的三个元素(除了最后的else逻辑分支外)依次分别是“关键字”(if或者elseif)、“逻辑判断语句”(一个返回值为1或者0的命令、表达式或者变量)以及“判断语句”值为1时需要执行的“逻辑语句块”。当我们知道了这三者在if命令中的作用之后,我们就可以根据之前给出的逻辑流程图来解释执行if命令了。
当我们了解了if命令的解释执行步骤之后,我们也可以设计类似if语句的新的逻辑控制语句,希望我们的读者能够灵活应用,开拓思维,创造创新。
感谢你对新爸的关注和支持,你的鼓励和支持是我不断探索和创新的动力源泉!