2

在 DOS/批处理中,

if 08 lss 1 echo true

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

然而,

if 07 lss 1 echo true

不回显任何东西。01 到 07 不小于 1。

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

4

3 回答 3

5

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

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

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

任何不满足上述 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
于 2012-05-17T01:49:48.047 回答
1

08 和 09 是非法的。在八进制中,7 是最高的合法数字。零的前导数字表示以八进制表示的数字。

于 2012-05-17T01:10:55.673 回答
1

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

于 2012-05-17T01:11:29.887 回答