Board logo

标题: if 下的无效数字比较运算 [打印本页]

作者: Hanyeguxing     时间: 2009-10-3 21:22    标题: if 下的无效数字比较运算

可以这样总结,无效的8进制或16进制数字比较运算时:

1,被比较字符串不含-:无效数字与不含-的字符串作比较运算时,进行字符比较。
2,被比较字符串仅第一个字符是-:如果无效数字与-后字符相同,则无效数字小。
3,被比较字符串含-,且为上面情况以外的时候,无效数字与脱掉所有-(允许脱掉所有-后为空)后的字符串作字符比较。

@echo off
if 0 GTR - (
if 0899 LSS 08990 echo OK1
if 0899 LSS -0899 echo OK2
if 0899 LSS 0--9 echo OK3
if 0899 LSS -0-9 echo OK4
if 0899 LSS ---- echo OK5
)
pause
我想,这个例子应该是最能说明无效数字比较运算时-被脱掉以及所有的-都被脱掉的问题。

[ Last edited by Hanyeguxing on 2009-10-6 at 20:03 ]
作者: netbenton     时间: 2009-10-3 23:25
应该是不符合数字规则,就按字符串来较的,因为"-"在"0"之后,所以,08就小于-1了
作者: Hanyeguxing     时间: 2009-10-4 12:04
if 08 gtr - echo 08大于-
if 08 lss -1 echo 08小于-1
但奇怪的是,08与-比较,0大于-;而08与-1比较,却0小于-。很是奇怪,不明白怎么会这样?
作者: 523066680     时间: 2009-10-4 19:06
当做字符串比较的时候
是从第一位开始比较,直到出现第一个不同的为止。

咦~ 楼上说的…… 莫非是一个当做数字,一个当做字符串了……

[ Last edited by 523066680 on 2009-10-4 at 19:09 ]
作者: wxcute     时间: 2009-10-4 19:10
不错的发现,CMD 看来不是一般的难理解。
作者: plp626     时间: 2009-10-6 00:06
08不是合法数字,cmd当作字符串处理
作者: HAT     时间: 2009-10-6 09:31
有时间就多看看帮助
Numeric values are decimal numbers, unless
prefixed by 0x for hexadecimal numbers, and 0 for octal numbers.
So 0x12 is the same as 18 is the same as 022. Please note that the octal
notation can be confusing: 08 and 09 are not valid numbers because 8 and
9 are not valid octal digits.

作者: Hanyeguxing     时间: 2009-10-6 10:03


  Quote:
Originally posted by HAT at 2009-10-6 09:31:
有时间就多看看帮助
Numeric values are decimal numbers, unless
prefixed by 0x for hexadecimal numbers, and 0 for octal numbers.
So 0x12 is the same as 18 is the same as 022. Please note that the octal
notation can be confusing: 08 and 09 are not valid numbers because 8 and
9 are not valid octal digits.

我知道08不是合法数字,但在 if 下是可以按字符进行比较的。只是在与-和-0比较时有问题
作者: netbenton     时间: 2009-10-6 13:06
试出来了!

if 08 lss -1 echo 08小于-1

这种情况应该是按字符串比较的,只是-1中的"-"号被丢弃了,
“-”号后的字符如果比0大则大

if 08 lss -# echo 08小于-#
if 08 lss -07 echo 08小于-07
if 08 lss -09 echo 08小于-09

但是却不能相等:
if 08 equ -08 echo 08 等于 -08

这应该是cmd.exe 对if 语句处理上的bug。
不过这些bug有时候却是可以利用的
作者: plp626     时间: 2009-10-6 13:41


  Quote:
Originally posted by Hanyeguxing at 2009-10-4 12:04 PM:
if 08 gtr - echo 08大于-
if 08 lss -1 echo 08小于-1
但奇怪的是,08与-比较,0大于-;而08与-1比较,却0小于-。很是奇怪,不明白怎么会这样?

不好意思,我楼上的帖子没有针对楼主的这个疑问,我现在刚看到。

也许是bug。。。
作者: Hanyeguxing     时间: 2009-10-6 13:50
已解决,非常感谢netbenton!

[ Last edited by Hanyeguxing on 2009-10-6 at 15:40 ]
作者: gool123456     时间: 2010-4-22 20:52


  Quote:
Originally posted by netbenton at 2009-10-6 13:06:
试出来了!

if 08 lss -1 echo 08小于-1

这种情况应该是按字符串比较的,只是-1中的"-"号被丢弃了,
“-”号后的字符如果比0大则大

if 08 lss ...

我认为IF是取位比较的。
大家可以使用下面的IF语句试下:

if 08 lss -0# echo 08小于-#
if 008 lss -07 echo 08小于-07
if 8 lss -09 echo 08小于-09
pause

然后在测试下面的:
if 08#0 lss -9#0 echo 08小于-#
if 008 lss -07 echo 08小于-07

if 8 lss -09 echo 08小于-09
pause

以下是我做的分析:
当IF遇到同时包含数字和字符的字符串比较大小时,由于无法比较大小,就同时向后移位取数比较,取代了原先的那位,就像SHIFT命令那样,取参!直到取到都是数字时,才做比较。大者为大。
作者: Hanyeguxing     时间: 2010-4-22 21:01
if a1 equ b1 echo.一样吗
作者: Hanyeguxing     时间: 2010-4-22 21:02


  Quote:
Originally posted by gool123456 at 2010-4-22 20:52:
以下是我做的分析:
当IF遇到同时包含数字和字符的字符串比较大小时,由于无法比较大小,就同时向后移位取数比较,取代了原先的那位,就像SHIFT命令那样,取参!直到取到都是数字时,才做比较。大者为大。  ...


if a1 equ b1 echo.一样吗

作者: gool123456     时间: 2010-4-22 21:19
if 的EQU应该是做字符串比较的 大小就不同了。
作者: gool123456     时间: 2010-4-22 21:24
其实我也不清楚IF的运作方式,我这里只是做个测试的和个人认为。具体还是还靠大伙一起努力!
作者: Hanyeguxing     时间: 2010-4-23 20:53


  Quote:
Originally posted by gool123456 at 2010-4-22 21:24:
其实我也不清楚IF的运作方式,我这里只是做个测试的和个人认为。具体还是还靠大伙一起努力!

通过下面两个例子就可以看出比较字符和比较运算的区别
if 33 equ 0x21 echo.相等
if not 33==0x21 echo.不同

if 0 equ 00 echo.相等
if not 0==00 echo.不同

作者: gool123456     时间: 2010-4-24 04:19


  Quote:
Originally posted by Hanyeguxing at 2010-4-23 20:53:

通过下面两个例子就可以看出比较字符和比较运算的区别
if 33 equ 0x21 echo.相等
if not 33==0x21 echo.不同

if 0 equ 00 echo.相等
if not 0==00 echo.不同

幸好 hangyeguxing兄及时的帮我矫正错误,要不然还不知道搞出什么来呢。。看来我还要努力学习!

这一次是我对IF比较的错误理解!!!

刚才我测试下,是通过的:
if 041 equ 0x21 echo.相等
if not 33==0x21 echo.不同
pause

if 001 equ 001 echo.相等
if not 05==005 echo.不同
pause

再次感谢~!