测试的第二部分,即
{ $HI == 1 }
是错误的,因为我想您对 Tcl 中大括号的含义感到困惑。大括号与 不同,它们不能( ... )
在数学表达式中用于更改评估中使用的优先级。
大括号用于组成包含空格的字符串,并使其显示为 Tcl 命令的单个参数,但不会在其中执行替换。
在您的情况下,$HI
不会用HI
变量的值替换,因此您正在形成一个字符串,其中包含您在大括号内看到的所有确切字符,包括前导和尾随空格。
如果你这样做
if {{ $HI == 1 } eq {$HI == 1}} {
puts "same"
} else {
puts "not the same"
}
你会得到not the same
结果。(eq
在表达式中执行字符串比较。)
如果您使用双引号字符作为字符串分隔符,您也不会得到正确的含义,即
" $HI == 1 "
在这种情况下,您的变量实际上被其值替换,因此就像您直接编写的一样(假设$HI
is 1
,如您的代码中所示):
" 1 == 1 "
但它又是字符串。
为什么 Tcl 抱怨?正如它所说,您正在尝试使用非数字字符串作为 的操作数&&
,并且{ $HI == 1 }
不是数字,因为无法将其视为数字,因此 Tcl 无法根据数字转换为真/假值(如果为 0,则为 false,如果不为 0,则为 true),并且发生错误。
我想你真正想写的是
if { [ info exists HI] && ( $HI == 1 ) } { puts "Hello World "}
# ^ ^
# |__________|____ note ( ) instead of { }
给予==
相对于更高的优先级&&
,或使条件更清晰。expr
,它在 an 的测试条件中被隐式调用,它if
知道圆括号的含义与您在其他编程语言和数学中找到的含义相同:更改评估顺序。
正如在其他答案和评论中所指出的那样,你真的不需要括号,因为(在 C 和许多其他语言中)等于运算符==
的优先级高于布尔值 and &&
。但如果你愿意,你可以放心使用( ... )
:
if {2 - 1 * 2} { puts yes } { puts no }
给出no
,因为表达式的计算2 - (1 * 2)
结果为 0。
if {(2 - 1) * 2} { puts yes } { puts no }
给出,yes
因为(2 - 1) * 2
是 2。