楼 主
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有时候却是可以利用的
第 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应该是做字符串比较的 大小就不同了。
论坛跳转:
— 请选择 —
站务公告 & 版主讨论
意见反馈 & 网友交流
DOS学习入门 & 精彩文章 (教学室)
DOS疑难解答 & 问题讨论 (解答室)
DOS启动盘 & LOGO技术 (启动盘室)
DOS批处理 & 脚本技术(批处理室)
DOS媒体世界 & 网络技术 (多媒体室)
DOS汉化世界 & 中文系统 (中文化室)
DOS开发编程 & 发展交流 (开发室)
DOS软件下载 & 游戏分享 (下载室)
GRUB4DOS、SYSLINUX及其它启动管理软件讨论专区
其它操作系统综合讨论区
WinPE、PowerShell及其它命令行系统专区
贴图灌水、文学娱乐专区
网络日志(Blog)
论坛回收站
├ 链接失效,待修正