中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 15:02
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » if 下的无效数字比较运算 查看 2,991 回复 17
楼 主 if 下的无效数字比较运算 发表于 2009-10-03 21:22 ·  中国 吉林 延边朝鲜族自治州 延吉市 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
可以这样总结,无效的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 ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
wxcute +2 2009-10-04 19:09
2 发表于 2009-10-03 23:25 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
应该是不符合数字规则,就按字符串来较的,因为"-"在"0"之后,所以,08就小于-1了
精简
=> 个人网志
3 发表于 2009-10-04 12:04 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
if 08 gtr - echo 08大于-
if 08 lss -1 echo 08小于-1
但奇怪的是,08与-比较,0大于-;而08与-1比较,却0小于-。很是奇怪,不明白怎么会这样?
4 发表于 2009-10-04 19:06 ·  中国 广东 广州 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
当做字符串比较的时候
是从第一位开始比较,直到出现第一个不同的为止。

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

[ Last edited by 523066680 on 2009-10-4 at 19:09 ]
5 发表于 2009-10-04 19:10 ·  中国 福建 三明 电信
中级用户
★★
积分 458
发帖 211
注册 2006-07-26 19:42
20年会员
UID 59307
状态 离线
不错的发现,CMD 看来不是一般的难理解。
┌───────┐
├→学习→实践→┤
└───────┘
6 发表于 2009-10-06 00:06 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
08不是合法数字,cmd当作字符串处理
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
7 发表于 2009-10-06 09:31 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
有时间就多看看帮助
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.
8 发表于 2009-10-06 10:03 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
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比较时有问题
9 发表于 2009-10-06 13:06 ·  中国 广东 东莞 电信
银牌会员
★★★
批处理编程迷
积分 1,916
发帖 752
注册 2008-12-28 04:30
17年会员
UID 135147
性别 男
来自 广西
状态 离线
试出来了!

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有时候却是可以利用的
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
Hanyeguxing +4 2009-10-06 13:51
精简
=> 个人网志
10 发表于 2009-10-06 13:41 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
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。。。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
11 发表于 2009-10-06 13:50 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
已解决,非常感谢netbenton!

[ Last edited by Hanyeguxing on 2009-10-6 at 15:40 ]
12 发表于 2010-04-22 20:52 ·  中国 广东 广州 电信
初级用户
★★
积分 89
发帖 76
注册 2009-12-13 13:41
16年会员
UID 156499
性别 男
状态 离线
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命令那样,取参!直到取到都是数字时,才做比较。大者为大。
13 发表于 2010-04-22 21:01 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
14 发表于 2010-04-22 21:02 ·  中国 吉林 延边朝鲜族自治州 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
Originally posted by gool123456 at 2010-4-22 20:52:
以下是我做的分析:
当IF遇到同时包含数字和字符的字符串比较大小时,由于无法比较大小,就同时向后移位取数比较,取代了原先的那位,就像SHIFT命令那样,取参!直到取到都是数字时,才做比较。大者为大。 ...


if a1 equ b1 echo.一样吗
15 发表于 2010-04-22 21:19 ·  中国 广东 广州 电信
初级用户
★★
积分 89
发帖 76
注册 2009-12-13 13:41
16年会员
UID 156499
性别 男
状态 离线
if 的EQU应该是做字符串比较的 大小就不同了。
论坛跳转: