1

我在 TCL 编程方面相当新,通过阅读基础知识,我遇到了以下代码片段:

set x 0;
while "$x < 3" {
    set x [expr $x + 1]
    if {$x >6} break;
    if "$x > 2" continue;
    puts "x is $x"; 
    }
puts "exited second loop with X equal to $x\n"

执行时,结果如下:

x is 1
x is 2
退出第二个循环,X 等于 7

令我惊讶的是,当执行 continue 命令时,似乎没有评估 while 循环测试 (x<3)。然而,在 tcl 手册页中声明“正文中的 continue 语句将停止代码的执行,并且将重新评估测试。

我错过了什么?

4

1 回答 1

9

因为您在 "$x < 3" 中使用了引号,所以您只评估该条件一次:tcl 解释器第一次看到它,永久地使测试“0 < 3”。因为它总是正确的,所以只有在 [break] 时才退出 while 循环的主体。

如果您在 while 条件中使用大括号 {} 而不是引号 "",则该测试仅由 while 循环本身评估,而不是由 tcl 解释器的替换传递评估,并按您预期的方式执行。

经验法则:在 if/while/for 等测试中始终使用 {}(除非第一个提到的行为是您要寻找的)。

于 2010-12-22T14:15:47.250 回答