String if语句中的字符串比较问题

String if语句中的字符串比较问题,string,compare,tcl,failing-tests,String,Compare,Tcl,Failing Tests,此字符串比较脚本有问题: set result [string range "0002150C0E67" 8 11 ]; if {[expr {$result != "FFFF" && $result != "0000"}]} {set result "OK byte 5&6 = 0x$result" } {set result "Fail Byte 5&6 = 0x$re

此字符串比较脚本有问题:

set result [string range "0002150C0E67" 8 11 ];
if {[expr {$result != "FFFF"  && $result != "0000"}]} {set result "OK byte 5&6 = 0x$result" } {set result "Fail Byte 5&6 = 0x$result" };
如果我将“0002150C0E67”更改为“0002150C0D67”或“0002150C0F67”(以及许多其他组合),我会得到一个OK结果


怎么了?

如果我们查看您的代码:

set result [string range "0002150C0E67" 8 11 ]
此时,
result
被设置为字符串
0E67
。这是一个看起来像浮点数的字符串,其值为0×1067,即零

现在,简化您的条件(额外的
expr
没有添加任何内容)并重新格式化以遵循传统样式(以功能等效的方式),我们得到以下结果:

if {$result != "FFFF" && $result != "0000"} {
    set result "OK byte 5&6 = 0x$result" 
} else {
    set result "Fail Byte 5&6 = 0x$result" 
}
如我们所见,第二个not equals比较不满足,因此选择了“Fail”路径。更好的方法是像这样解析字符串:

scan "0002150C0E67" "%8x%4x" -> result
然后,我们对结果和
格式进行数值比较,以生成输出:

if {$result != 0xFFFF && $result != 0} {
    set result [format "OK byte 5&6 = 0x%04x" $result]
} else {
    set result [format "Fail Byte 5&6 = 0x%04x" $result]
}

如果我们查看您的代码:

set result [string range "0002150C0E67" 8 11 ]
此时,
result
被设置为字符串
0E67
。这是一个看起来像浮点数的字符串,其值为0×1067,即零

现在,简化您的条件(额外的
expr
没有添加任何内容)并重新格式化以遵循传统样式(以功能等效的方式),我们得到以下结果:

if {$result != "FFFF" && $result != "0000"} {
    set result "OK byte 5&6 = 0x$result" 
} else {
    set result "Fail Byte 5&6 = 0x$result" 
}
如我们所见,第二个not equals比较不满足,因此选择了“Fail”路径。更好的方法是像这样解析字符串:

scan "0002150C0E67" "%8x%4x" -> result
然后,我们对结果和
格式进行数值比较,以生成输出:

if {$result != 0xFFFF && $result != 0} {
    set result [format "OK byte 5&6 = 0x%04x" $result]
} else {
    set result [format "Fail Byte 5&6 = 0x%04x" $result]
}

另一种方法是将
!=
运算符更改为
ne
,以强制进行字符串比较,但这实际上是关于进行整数解析的,所以我们应该坚持下去。您好,多纳尔,非常感谢。它可以工作,现在我们可以再次生成:)另一种方法是更改
=
运算符到
ne
以强制进行字符串比较,但这实际上是关于进行整数解析的,所以我们应该坚持这样做。您好,多纳尔,非常感谢。它工作了,现在我们可以再次生成:)@glennjackman诀窍是
0E67
是一个浮点数。更传统的编写方式是
0.0
。是的,如果OP提到
0E67
是一种异常现象,那就更清楚了。乍一看,其他两个似乎是不正常的。直到我真正运行了代码,我才意识到出了什么问题。@glennjackman诀窍在于
0E67
是一个浮点数。更传统的编写方式是
0.0
。是的,如果OP提到
0E67
是一种异常现象,那就更清楚了。乍一看,其他两个似乎是不正常的。直到我真正运行了代码,我才意识到出了什么问题。