在DOS / Batch中,
if 08 lss 1 echo true
回应“真实”。这同样适用于09. 08和09都小于1。
然而,
if 07 lss 1 echo true
不回应任何事情。 01至07不小于1.
为什么呢? 08和09有什么特别之处?
答案 0 :(得分:5)
扩展了sarnold和David Schwartz已经提供的答案......
我从未见过任何文档声明IF支持八进制或十六进制数字表示法。但是你的问题促使我做了一些测试,实际上它确实支持SET / A支持的相同数字符号。
任何不满足上述3个数字符号中的任何一个的字符集都被视为字符串。
如果比较的两边都是有效数字,则进行数字比较。
如果任何一方不是有效数字,则进行字符串比较。
07是十进制值为7的有效八进制表示法,且不小于1.
08和09的前缀为0但是无效的八进制表示法,因此进行字符串比较。任何以0开头的字符串将排序为小于以1开头的字符串。
确认支持八进制和十六进制表示法的一些有趣的测试。
if 0xA equ 10 echo ok
if 011 equ 9 echo ok
有趣的是,SET / A语句中的无效八进制或十六进制表示法会引发错误。但IF语句中的无效八进制或十六进制表示法不会引发错误。它只是强制进行字符串比较。
<强> 更新 强>
有效号码前面可能带有符号指示符: - 或+
if +0xA equ +10 echo ok
if -011 equ -9 echo ok
答案 1 :(得分:1)
答案 2 :(得分:1)
通常,前导0
表示您希望在octal中解析数字。我希望08
或09
实际上是错误条件;也许批处理语言没有一个好的机制来表示输入是不正确的?