TCL如何要求两个操作数来确定IF语句中的结果



TCL的新手,似乎遇到了短路问题。 来自 vbscript,我能够正确执行此操作,但是尝试转换为 TCL 脚本时,我遇到了短路副作用的问题,并且一直在尝试找到正确的方法。

在下面的代码片段中,我想仅在双方都为 true 时才执行"做某事",但由于短路,如果第一个参数无法确定表达式的值,它只会计算第二个参数。

    if {$basehour != 23 && $hours != 0} {
        do something
    }

也许我没有在寻找正确的东西,但到目前为止我无法找到解决方案。 任何提示将不胜感激。

&&运算符总是在 Tcl 中做短路(就像它在 C 和 Java 以及许多其他语言中所做的那样)。如果你想要另一个版本,并且可以保证两个子表达式都产生布尔值(例如,它们来自你正在做的相等性测试),那么你可以改用&运算符,它执行逐位 AND 并在处理布尔值时做你想要的。如果您正在这样做,为了清楚起见,明智的做法是在子表达式两边加上括号;虽然每个人都记得==&&方面的优先顺序,但W.R.T.的顺序。 &经常被遗忘。(括号在执行成本方面是免费的。

if {($basehour != 23) & ($hours != 0)} {
    do something
}

但是,通常没有必要这样做。如果你想要一个 AND,你正在输入到布尔测试中(例如,if 命令的表达式),那么没有理由不短路,就像在你的原始代码中一样;如果第一个子句给出 false,则第二个子句不会更改整个表达式产生的值。

最新更新