我有下面的小代码我期待TCL解释器为未初始化的变量抛出错误但它没有抛出错误
set v1 "test"
if { ($v1 != "test") && ($v2 == "3") } {
puts "fun"
}
#v2 is not initialized
Run Code Online (Sandbox Code Playgroud)
解释器没有为v2抛出错误,因为它没有初始化
第一,子语言expr
在TCL,(它也被用在if
,while
,for
)以另一种方式比TCL本身的工作原理.在这个子语言中,$
并不意味着变量替换,而是变量引用.在评估包含子表达式时访问变量.并且逻辑操作是短路的,从左到右评估操作数直到结果已知,如在C语言中.
这就是为什么$v2 == 3
不在您的示例中进行评估,并且不存在$v2
不是错误.此行为通常与这样的代码一起使用:
if {[info exists myvar] && $myvar} { .... }
Run Code Online (Sandbox Code Playgroud)