while循环中{}和“”之间的区别

时间:2019-06-04 23:26:11

标签: while-loop tcl

我试图弄清楚为什么在本例中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”仍然为真时会怎样?

1 个答案:

答案 0 :(得分:3)

当tcl尝试评估while语句时,它所做的第一件事是将语句拆分为单词,并替换双引号或方括号中的任何内容。花括号中的数据不会被替换。

这发生在调用while命令之前。在这一轮替换之后,所有替换的结果作为参数传递给while命令。

因此,while语句有两个参数:

  1. 0 <5
  2. 花括号中的所有内容

while看到了一个不会改变的静态条件,因此循环永远运行。

您应该使用花括号,以便tcl在每次迭代时将条件传递给while命令:

while {$x < 5} { ... }

通过以上所述,while得到以下参数:

  1. $ x <5
  2. 花括号中的所有内容