【问题标题】:Difference between {} and "" in while loopwhile循环中{}和“”的区别
【发布时间】:2019-06-05 07:36:58
【问题描述】:

我试图弄清楚为什么在这个例子中,while 循环会无限期地持续下去。给出的解释是

如果 test 放在引号内,则替换阶段会将任何变量替换为其当前值,并将该测试传递给 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

【问题讨论】:

  • 你不是基本上将while条件设置为0 &lt; 5,因为它在引号中而不会被重新评估?例如,由于它是引号,因此它不会将其视为需要重新评估的表达式,而是将其视为保持该值的简单值(true)。就像我说 while true {do some stuff} 一样,它没有任何理由会检查 true 是否仍然正确。

标签: while-loop tcl


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2011-02-11
    • 1970-01-01
    • 2016-04-01
    • 2016-07-08
    • 2022-12-17
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多