gpt4 book ai didi

tcl - TCL中的if语句

转载 作者:行者123 更新时间:2023-12-03 21:09:03 25 4
gpt4 key购买 nike

我对以下代码的 tcl 中的 if 语句有疑问:

if {(($number == 1)&&($name == "hello")) || (($number == 0)&&($name == "yes"))} {
#do something here
}

上面的代码有效,但如果我这样写:
if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {
#do something here
}

它提示 $number预计是一个 bool 值,为什么?第二个不是有效的表达式吗?如何纠正?

最佳答案

大括号,{} , 和括号, () , 在 Tcl 中不可互换。

形式上,大括号(带有 one exception )是一种引用,表示不对内容执行进一步的替换。在上面的第一种情况下,这意味着该参数被传递给 if没有替换,将其计算为表达式。表达式子语言具有与一般 Tcl 强相似的大括号解释方案;它们表示没有进一步替换的文字值。

相比之下,括号在 Tcl 中大多不是特殊的。异常(exception)是数组元素的名称(例如, $foo(bar) )、表达式子语言(使用它们进行分组,就像编程中的数学表达式一样)和正则表达式子语言(它们是不同类型的分组和其他一些事情)。在 Tcl 中使用括号——平衡的或其他形式的——作为命令名称的一部分是完全合法的,但你可能会让你的程序员同事提示你编写了令人困惑的代码。

细节

在这个特定情况下,这个 if 的测试表达式:

if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {...}

被解析为:
blah#1 LOGICAL_OR blah#2

where each blah is a literal. Unfortunately, blah#1 (which is exactly equal to $number == 1 && $name == "hello") has no boolean interpretation. (Nor does blah#2 but we never bother to consider that.) Things are definitely going very wrong here!

The simplest fix is to change those bogus braces back to parentheses:

if {($number == 1 && $name == "hello") || ($number == 0&&$name == "yes")} {...}

我打赌这就是你最初想要的。

警告:高级主题

但是,另一个解决方法是添加一些额外的内容:
if {[expr {$number == 1 && $name == "hello"}] || [expr {$number == 0&&$name == "yes"}]} {...}

这通常不是一个好主意 - 没有额外 yield 的额外批量 - 但是当您尝试使用动态生成的表达式作为测试条件时它是有意义的。 不要这样做除非你真的很确定你需要这样做!我是认真的。这是一种您几乎不需要的非常先进的技术,而且通常有更好的方法来实现您的总体目标。如果您认为您可能需要它,看在上帝的份上,请在 SO 上询问,我们将尝试找到更好的方法;几乎总有一个可用。

关于tcl - TCL中的if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11260659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com