Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcl 在条件中使用大括号_Tcl - Fatal编程技术网

Tcl 在条件中使用大括号

Tcl 在条件中使用大括号,tcl,Tcl,写不带大括号的条件是否安全?e、 g: if [$step > 0] { # … } if {[$step > 0]} { # … } 还是我必须用牙套?e、 g: if [$step > 0] { # … } if {[$step > 0]} { # … } 与带大括号的行相比,不带大括号的行看起来可读。 但是有什么缺点/需要注意的地方吗?你需要牙套。此外,您不需要[][]将其内容作为命令进行评估,并将其自身替换为命令的返回值。那么你的第一个版本 if [$st

写不带大括号的条件是否安全?e、 g:

if [$step > 0] {
# …
}
if {[$step > 0]} {
# …
}
还是我必须用牙套?e、 g:

if [$step > 0] {
# …
}
if {[$step > 0]} {
# …
}
与带大括号的行相比,不带大括号的行看起来可读。

但是有什么缺点/需要注意的地方吗?

你需要牙套。此外,您不需要
[]
<代码>[]将其内容作为命令进行评估,并将其自身替换为命令的返回值。那么你的第一个版本

if [$step > 0] { }
假设
$step
3
,则相当于

if [3 > 0] { }
它试图将
[3>0]
作为命令进行评估,并抱怨
3
不是命令

第二个版本也有同样的问题,因为表达式计算任何嵌入的命令替换

你真正想要的只是

if {$step > 0} { ... }

需要记住的是,在Tcl中,控制结构的行为方式与用户定义的函数相同(事实上,通常可以使用Tcl代码实现)。
if
命令采用2-4个参数,形式为
“if”条件,然后块[[“else”]else块]
。第一个参数始终是条件。第二个是then块。第三个是可选单词“else”,第四个是可选的else块(如果存在“else”单词,则需要else块)


由于此构造采用简单参数,因此需要确保为其提供参数。因此,条件参数需要用括号括起来,以确保它是一个单独的参数(同时也确保不会过早解释任何替换,因为条件的计算将为您解释它们)。类似地,then块和else块也用大括号括起来。

如果[string match…]{…},这个答案对这种情况也有效吗?@Dor:简短的答案是“是的,您仍然应该使用大括号”。但这个案例有点不同。在您的问题中,您的条件是一个适合传递给
expr
的表达式(这就是
if
所做的)。在本例中,表达式是返回0或1的命令替换。正确的做法仍然是使用大括号,因为
if
将为您计算命令替换,但在技术上,在这种情况下,计算
0
1
并不重要,因为表达式返回相同的
0
1
。但我建议始终使用大括号以保持一致性使用大括号还可以防止“双重替换”——这意味着tcl解析器不必替换变量和命令,因为expr解析器无论如何都要这样做。