为什么Tcl expr不等于2个真布尔值?
我有这个剧本:为什么Tcl expr不等于2个真布尔值?,tcl,Tcl,我有这个剧本: $ cat tmp/bool.tcl puts "[expr [expr True] == [expr true] ]" 我希望它打印1,因为“True”和“True”都是布尔True,所以它们应该相等,但我得到0: $ tclsh tmp/bool.tcl 0 当然,这是简化的代码。实数代码生成字符串“True”、“True”、“Yes”、“Yes”等形式的布尔值 在比较它们之前,我是否必须将它们全部小写 我不明白为什么上面的代码不相等 % puts "[expr [exp
$ cat tmp/bool.tcl
puts "[expr [expr True] == [expr true] ]"
我希望它打印1,因为“True”和“True”都是布尔True,所以它们应该相等,但我得到0:
$ tclsh tmp/bool.tcl
0
当然,这是简化的代码。实数代码生成字符串“True”、“True”、“Yes”、“Yes”等形式的布尔值
在比较它们之前,我是否必须将它们全部小写
我不明白为什么上面的代码不相等
% puts "[expr [expr True] == [expr true] ]"
0
让我们看看双方都做了什么:
% expr True
True
% expr true
true
因此,两者都被认为是布尔值,但并不相等。让我们将这些字符串转换为“规范”布尔形式:
% set a True
True
% set b true
true
% expr {$a == $b}
0
% expr {!!$a == !!$b}
1
这里发生了什么:一步一步
% expr {$a}
True
% expr {!$a}
0
% expr {!!$a}
1
本机“真/假”值分别为“1/0”。显然1==1
点评:这感觉就像回到了Tcl的“一切都是一根弦”的根,“真”和“真”的弦是不相等的
让我们看看双方都做了什么:
% expr True
True
% expr true
true
因此,两者都被认为是布尔值,但并不相等。让我们将这些字符串转换为“规范”布尔形式:
% set a True
True
% set b true
true
% expr {$a == $b}
0
% expr {!!$a == !!$b}
1
这里发生了什么:一步一步
% expr {$a}
True
% expr {!$a}
0
% expr {!!$a}
1
本机“真/假”值分别为“1/0”。显然1==1
观点:这感觉像是回到了Tcl的“一切都是字符串”的词根,字符串“True”和“True”是不相等的。定义了要做的事(expr
页面中的文档本身更加模糊):
如果可能,进行数字比较,否则进行精确字符串比较
True
和True
都不是数字,因此使用精确的字符串比较。这两个值在其字符串表示的第一个字符中不同;因此,它们在==
的意义上并不相等
若要比较非受控布尔值是否相等,请首先将它们反转为的结果代码>运算符既是布尔运算符又是数字运算符(即,它是0或1):
定义了要做的事情(expr
页面中的文档本身比较模糊):
如果可能,进行数字比较,否则进行精确字符串比较
True
和True
都不是数字,因此使用精确的字符串比较。这两个值在其字符串表示的第一个字符中不同;因此,它们在==
的意义上并不相等
若要比较非受控布尔值是否相等,请首先将它们反转为的结果代码>运算符既是布尔运算符又是数字运算符(即,它是0或1):
我的回答暗示:1)您不需要嵌套expr
调用;2) 在一些情况下,嵌套expr
是有意义的。这不是其中之一。我的回答暗示:1)你不需要嵌套expr
调用;2) 在一些情况下,嵌套expr
是有意义的。这不是其中之一。我会使用下面的直接测试:expr{$a&&$b}
。我会使用下面的直接测试:expr{$a&&b}
。