% set HI 1
1
% if { [ info exists HI] && { $HI == 1 } } { puts "Hello World "}
can't use non-numeric string as operand of "&&"
%
Run Code Online (Sandbox Code Playgroud)
这两种情况都可以单独测试.如何使测试的&&在TCL中起作用?
仅此一点起作用
% if { $HI == 1 } { puts "Hello World "}
Hello World
Run Code Online (Sandbox Code Playgroud)
这也是独一无二的.
% if { [ info exists HI] } { puts "Hello World "}
Hello World
Run Code Online (Sandbox Code Playgroud)
你不需要额外的花括号; 这应该工作正常:
if { [info exists HI] && $HI == 1 } { puts "Hello World" }
Run Code Online (Sandbox Code Playgroud)
测试的第二部分,即
{ $HI == 1 }
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为我认为你对Tcl中括号的含义感到困惑.大括号不相同( ... ),它们不能用于数学表达式来改变评估中使用的优先级.
大括号用于组成包含空格的字符串,并使其显示为Tcl命令的单个参数,但不在其中执行替换.
在您的情况下,$HI它不会被HI变量的值替换,因此您将形成一个字符串,其中包含您在大括号内看到的所有确切字符,包括前导和尾随空格.
如果你这样做
if {{ $HI == 1 } eq {$HI == 1}} {
puts "same"
} else {
puts "not the same"
}
Run Code Online (Sandbox Code Playgroud)
你会得到not the same结果.(eq在表达式中执行字符串比较.)
如果你使用双引号字符作为字符串分隔符,那么你也不会得到正确的意思
" $HI == 1 "
Run Code Online (Sandbox Code Playgroud)
在这种情况下,你的变量实际上是用它的值代替的,所以就像你直接写的那样(假设$HI是1,就像你的代码一样):
" 1 == 1 "
Run Code Online (Sandbox Code Playgroud)
但它的字符串,再次.
为什么Tcl抱怨?因为它说,你要使用一个非数字字符串作为操作数&&,并且{ $HI == 1 }是不是数字,因为没有办法看到的是一个数字,这样的Tcl不能转换到依赖于数字真/假值(如果为0则为false,如果不为0则为true,并且发生错误.
我想你真正想写的是
if { [ info exists HI] && ( $HI == 1 ) } { puts "Hello World "}
# ^ ^
# |__________|____ note ( ) instead of { }
Run Code Online (Sandbox Code Playgroud)
给予更高的优先级的==关于&&,或使条件更加清晰.expr,在a的测试条件中隐式调用if,知道圆括号与您在其他编程语言和数学中找到的含义相同:更改评估顺序.
正如在其他答案和评论中已经指出的那样,你真的不需要括号,因为(如在C和许多其他语言中),等于运算符==的优先级高于布尔值和&&.但如果你愿意,你可以( ... )毫无顾虑地使用:
if {2 - 1 * 2} { puts yes } { puts no }
Run Code Online (Sandbox Code Playgroud)
给出no,因为表达式被计算为2 - (1 * 2)0.
if {(2 - 1) * 2} { puts yes } { puts no }
Run Code Online (Sandbox Code Playgroud)
给人yes因为(2 - 1) * 2是2.
| 归档时间: |
|
| 查看次数: |
1188 次 |
| 最近记录: |