找回密码
 加入
搜索
查看: 6322|回复: 16

[AU3基础] 吐槽下au3关于‘数字比较’的逻辑

 火.. [复制链接]
发表于 2015-12-27 22:42:58 | 显示全部楼层 |阅读模式
本帖最后由 caicaicaicaijj 于 2015-12-27 22:51 编辑

这几天写个小东西,需要比较数字,后来发现这个现象
yunsi(9, 8)
yunsi("9", 8)
yunsi("9", "8")
yunsi("19", "8") ;这个不成立的
yunsi("19", "18");但是为啥这个会成立?

Func yunsi($a, $b)
        ;正确写法应该为,Number一定不能省啊
        ;If Number($a) >Number($b) Then
        If $a > $b Then 
                MsgBox(0, "True", $a&">"&$b&"成立")
        Else
                MsgBox(0, "False", $a&">"&$b&"不成立!")
        EndIf
EndFunc   ;==>yunsi
先看帮助'若某个字符串被当作数字进行运算,后台调用Number() 后它又并不能表示有效的数值, 则它将被假定为0."
这个比较扯,后台根本没有调用Number,我用的是3.3.9.21,不知后面版本有无改善。
居然是这个逻辑:如果不用关键字Number,带引号的数字如果位数相同是可以比较的,若位数不同则比较不成立
还有个现象
如果位数不同,且有一个为纯数字,则比较也是成立的,如下:
yunsi('19', 8)
yunsi(19, '8')
也就是说比较两个数字时,只需一个带关键字Number即可
所以把上面那句改为
If $a>Number($b) Then
或
If Number($a) >$b Then
即可
发表于 2015-12-28 00:08:48 | 显示全部楼层
这都被你发现了~~  看来后台调用Number是猜测的…
不过,进行数字比较前先自行调用Number肯定是稳妥的,也是好习惯
发表于 2015-12-28 09:00:38 | 显示全部楼层
回复 1# caicaicaicaijj


    学过语言的人应该知道,这属于编译器里的数据转换,两个都是字符串,就是按字符串比较,"19"和"8"比较是按位的,1比8小,所以"19"<"8"
我曾经在编写脚本时,确实是经过一段时间才发现这个隐藏错误的,平常还真不注意。
发表于 2015-12-28 09:52:52 | 显示全部楼层
多谢楼主分享
发表于 2015-12-28 10:08:51 | 显示全部楼层
字符串当成数字做数学运算是没问题的,例如+-*/什么的都可以。
但是比较大小不行,有个土办法可以解决,就是字符串+0,这样就能变成数字了
发表于 2015-12-29 09:27:52 | 显示全部楼层
你比较数字的时候,硬给函数字符串类型的值,本身就是个BUG,其他语言连机会都不会给你当场就报错。

你冰箱不插电,或给的不是220V,那就别讨论制冷有没有问题,不科学。
 楼主| 发表于 2015-12-29 14:18:35 | 显示全部楼层
回复 6# skyfree
本来这个问题就是针对AU3来讨论的,貌似在AU3里这并不是bug,既然后台自动调用Number,那我又何必再次调用呢,因为帮助里一句话就会误导我们这些菜鸟钻入牛角。经过测试,个人觉得帮助里应该改为:若某个字符串被当作数字与纯数字进行运算时,后台调用Number() 后它又并不能表示有效的数值, 则它将被假定为0。
即:字符串类型的数字间进行运算,至少其中一个字符串必须需调用Number
发表于 2015-12-30 15:54:08 | 显示全部楼层
楼主简直强词夺理,帮助里面明明写的很清楚。
> 判断第一个值(左边)是否大于第二个值(右边).字符串将会根据字符代码逐字进行比较,即使字符串是一个数字("99" >"888" = True). 
因为字符串也可以进行>比较,您传两个字符串给它比较,它为什么要自动帮您转成数值型?
发表于 2015-12-30 22:55:37 | 显示全部楼层
本帖最后由 luren666 于 2015-12-30 23:01 编辑

如果一个是数值型,一个是字符串,那肯定没办法直接比较,所以系统会自动把字符型 的转成数值型,如果两个都是字符型 ,那系统认为是可以比较的,字符串比较是逐字进行比较,所以会出现("99" >"888" = True)的现像,这个很好理解,是楼主自己想歪了。您反过来想一下,如果au3默认都转换成数值型,会出现什么现像呢?那样的话,每次进行字符串比较的时候,au3都要先思考一下,这两个字符串是不是可以转换成数值型呢?然后..吐糟的人的口水估计都把作者淹死了。
 楼主| 发表于 2015-12-31 21:28:04 | 显示全部楼层
回复 9# luren666

你说的很对,之前是没搞清楚了,关键问题就在于不知道通过各种方法返回的数字变量到底是数值型还是字符型,也没去研究,一直认为系统会自动转换,,,,,,,,,没办法,,白菜一颗
发表于 2015-12-31 22:03:16 | 显示全部楼层
回复 7# caicaicaicaijj


    自动转换数据类型有自动转换的条件,而不是所有时刻都强制转成Number,在于你比较的方法和比较的数据类型。弱语法的语言更需要你自己去保持数据类型的准确性。
发表于 2016-1-3 13:39:59 | 显示全部楼层
本帖最后由 ura 于 2016-1-3 14:07 编辑
yunsi("9", 8)
yunsi("9", "8")
yunsi("19", "8") ;这个不成立的
;yunsi("19", "08") ;这个不成立的
yunsi("19", "18");但是为啥这个会成立?

;**// 条件不成立 //**
yunsi("19", "108")
yunsi("19", "01008")

Func yunsi($a, $b)
            local $aA=number($a)
            local $bB=number($b)
                    local $cC=stringLen($aA)
            local $dD=stringLen($bB)
        If $aA>=$bB  and $cC>=$dD Then
                MsgBox(0, "True", $a&">"&$b&"成立")
        Else
                MsgBox(0, "False", $a&">"&$b&"不成立!")
        EndIf
EndFunc   ;==>yunsi
引号内就不是数字了,而是字符串。当然使用number好点
发表于 2016-1-4 13:06:50 | 显示全部楼层
AU3不严谨的地方多了去了~
发表于 2016-1-4 14:02:19 | 显示全部楼层
au3只是一个免费脚本语音,不要要求那么高
发表于 2016-1-5 11:06:50 | 显示全部楼层
值得注意的细节问题,成败在于细节,学习了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-29 00:22 , Processed in 0.178658 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表