08小于1,但在DOS / Batch中07大于1。为什么?

时间:2012-05-17 01:06:34

标签: batch-file numbers comparison dos

在DOS / Batch中,

if 08 lss 1 echo true

回应“真实”。这同样适用于09. 08和09都小于1。

然而,

if 07 lss 1 echo true

不回应任何事情。 01至07不小于1.

为什么呢? 08和09有什么特别之处?

3 个答案:

答案 0 :(得分:5)

扩展了sarnold和David Schwartz已经提供的答案......

我从未见过任何文档声明IF支持八进制或十六进制数字表示法。但是你的问题促使我做了一些测试,实际上它确实支持SET / A支持的相同数字符号。

  • 任何不以0开头的数字[0-9]都被解释为十进制。
  • 任何前缀为0的数字[0-7]都将被解释为八进制。
  • 前缀为0x或0X的任何数字[0-9,A-F,a-f]都被解释为十六进制。

任何不满足上述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)

08和09是非法的。在八进制中,7是最高的合法数字。引号为零表示一个表示为八进制的数字。

答案 2 :(得分:1)

通常,前导0表示您希望在octal中解析数字。我希望0809实际上是错误条件;也许批处理语言没有一个好的机制来表示输入是不正确的?