比较运算问题


0
gongxy asked 8 年 ago

为什么下面两个表达式会得到不一样的值呢?

1 -lt 7 -lt 5

False

1 -le 7 -le 5

True

1 Answers
1
Best Answer
Mooser Lee 管理员 answered 8 年 ago

之前有人问过类似的问题,把两个值,前后调换了一下位置,发现返回结果不一致,以为是PowerShell的bug,其实不是。 PowerShell是机器,它不能像人一样理解A等于B,B就一定等于A。 它只能根据语法解析器设定的规则进行计算。 拿你的问题来说吧,没有括号,运算符的优先级应当是从左到右。 1 -lt 7=$true, 1-le 7=$true 于是问题可以拆解成,为什么$true -lt 5=$false,但是 $true – le 5=$true。 我们先再看一个比较:PS> [guid]::NewGuid() -lt 5 无法将“e1535768-9403-4a3c-8fc6-b8ef971a148f”与“5”进行比较。错误:“无法将值“5”转换为类型“System.Guid”。错误:“GU ID 应包含带 4 个短划线的 32 位数(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。””   这说明比较操作符是以 左边的类型为基准,如果它发现右边的类型和左边的类型不匹配,就会通过PowerShell语法解析器设定的自动类型转换功能尝试转换。$true – le 5 进行比较,会尝试把5先转换成bool,5非空,自然为true,接下来继续比较,$true -le $true=($true -lt $true)||($true -eq $true) = $true || $false = $true.    这样就讲的通了。