我试图弄清楚为什么在本例中while循环会无限期地继续进行。给出的解释是
如果将测试放在引号中,则替换阶段将用其当前值替换任何变量,并将该测试传递给while命令以进行评估,并且由于该测试只有数字,因此它将始终评估相同的数字>
我知道通常您只需要使用大括号而不是双引号,但是我想了解为什么不使用双引号。我也理解双引号将替换值,而大括号则不会。
set x 0
while "$x < 5" {
set x [expr {$x + 1}]
if {$x > 7} break
if "$x > 3" continue
puts "x is $x"
}
当我在循环中打印x时,我可以看到它增加了,因此在x为5的情况下。我希望“ set x”行将值更改为6,并且会跳过中断线。我希望x> 3行能够通过,当它检查“ $ x <5”仍然认为“ 6 <5”仍然为真时会怎样?
答案 0 :(得分:3)
当tcl尝试评估while语句时,它所做的第一件事是将语句拆分为单词,并替换双引号或方括号中的任何内容。花括号中的数据不会被替换。
这发生在调用while
命令之前。在这一轮替换之后,所有替换的结果作为参数传递给while命令。
因此,while
语句有两个参数:
while
看到了一个不会改变的静态条件,因此循环永远运行。
您应该使用花括号,以便tcl在每次迭代时将条件传递给while
命令:
while {$x < 5} { ... }
通过以上所述,while
得到以下参数: