在这个例子中,我试图弄清楚为什么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”仍然被解释为真?
发布于 2019-06-05 07:36:58
当tcl尝试计算while语句时,它做的第一件事是将语句拆分成单词,并替换双引号或方括号中的任何内容。大括号中的数据不会被替换。
这发生在调用while
命令之前。在此轮替换之后,所有替换的结果都将作为参数传递给while命令。
因此,为while
语句提供了两个参数:
while
看到的是一个永远不会改变的静态条件,因此循环永远运行。
您应该使用大括号,以便tcl在每次迭代时将条件传递给while
命令:
while {$x < 5} { ... }
有了上面的内容,while
将获得以下参数:
中的所有内容
https://stackoverflow.com/questions/56452511
复制相似问题