VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 9469|回复: 24

[经验技巧] InStr 数值型、布尔型、And 逻辑与,按位与

[复制链接]
 楼主| 发表于 2011-8-25 16:59:45 | 显示全部楼层 |阅读模式
因为 VB 中大于0的数都是 True,平时我习惯 If InStr() Then,省略“> 0”,一个没什么,几个就出 bug 了,刚刚中了一招,上来分享一下:

sLine(n)的值为 "gmake: *** [all] Error 2"

If Left(sLine(n), 5) = "gmake" And InStr(sLine(n), "***") And InStr(sLine(n), " Error ") Then

我本意是同时含有 "***" 和 " Error ",但这两个 InStr 的值分别为:

8
17

01000
10001

一按位与就变 0 了,大家吸取教训啊~~~~

点评

确实,有时候要求速度的话,我会把一长串And写成一长串嵌套的If,最多的有十几层……  发表于 2011-8-28 15:15
VB 编译器确实不够优化,And、Or、IIf 都不能短路的……  发表于 2011-8-26 13:20
如果If写成一行,我习惯把And替换成Then If  发表于 2011-8-26 12:57
 楼主| 发表于 2011-8-25 17:03:31 | 显示全部楼层
C 语言的逻辑与(&&)和按位与(&)是不同的运算符,VB却合并在一起,甚至初学者只认为 And 就是逻辑与。

可能 VB 的设计者觉得位运算属于低级语言,不应该有,但实际设计中 And 恰恰是位运算,反而不存在逻辑运算符。 Or、Not、Xor 应该也一样吧~
回复 支持 反对

使用道具 举报

发表于 2011-8-25 18:37:34 | 显示全部楼层
API中那些连接不就用or嘛,就是因为按位的缘故,我写过关于这个的一篇文章
http://blog.csdn.net/kylemong/article/details/6685777
回复 支持 反对

使用道具 举报

发表于 2011-8-25 22:56:28 | 显示全部楼层
两个表达式结果的逻辑
两个表达式如果是Boolean 型进行进行逻辑连接
否则进行位比较
回复 支持 反对

使用道具 举报

发表于 2011-8-25 23:00:53 | 显示全部楼层
回复 VBProFan 的帖子
VB 中大于0的数都是 True
谁告诉你的?应该是“非0就是True”……

再说了,VB的And,Or等是位运算,地球人都知道……泡饭你这都能中招啊(话说我大量在VB使用位域的Flags所以肯定不会中招)……

PS:有时候我会在位域代码上写错,例如判断位域的代码是If nFlags And &H4& Then xxx,清除位域的代码是nFlags = nFlags And Not &H4&,设置位域的代码是nFlags = nFlags Or &H4&,这最后一个我有时候会写错成nFlags = nFlags And &H4&……

PS2:我还经常写像下面那样的代码:n=((a>0) And &H1&) Or ((b>0) And &H2&)……

点评

我是针对 InStr 来说的,InStr 不会返回负数  发表于 2011-8-26 13:20
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-26 06:29:20 | 显示全部楼层
ymismy 发表于 2011-8-25 22:56
两个表达式结果的逻辑
两个表达式如果是Boolean 型进行进行逻辑连接
否则进行位比较

怪不知道我说 VB 干嘛要用 -1 作为 True,原来 -1 的二进制是全1,位运算和逻辑运算的结果一致……

点评

我用OD调试程序的时候就发现了……  发表于 2011-8-30 12:51
这个我知道,而且利用上了:n=((a>0) And &H1&) Or ((b>0) And &H2&)  发表于 2011-8-26 14:53
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-26 06:30:03 | 显示全部楼层
acme_pjz 发表于 2011-8-25 23:00
回复 VBProFan 的帖子

谁告诉你的?应该是“非0就是True”……

我使用位域的Flags时也肯定不会中招,但一用 InStr 就忘了……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-26 07:18:58 | 显示全部楼层
VBProFan 发表于 2011-8-26 06:29
怪不知道我说 VB 干嘛要用 -1 作为 True,原来 -1 的二进制是全1,位运算和逻辑运算的结果一致……

原来 CBool 的作用就是把非 0 的数转为 -1:

? cbool(17 and 8)
False

? cbool(17) and cbool(8)
True

function CBool(byval n as long) as long
  cbool = iif(n=0,0,-1)
end function


点评

这个cbool(17) and cbool(8) 我习惯写成17<>0 And 8<>0……  发表于 2011-8-28 15:18
楼下所言极是~  发表于 2011-8-26 21:45
CBool还有个功能,就是把字符串“True”和“False”也转成Boolean类型,其他字符串则报类型不匹配错误……  发表于 2011-8-26 14:54
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-8-28 00:07:12 | 显示全部楼层
本帖最后由 VBProFan 于 2011-8-28 00:12 编辑



b 是 True,Not b 还是 True,就算是按位取反也不对,灵异事件了……
FTP上传明明成功了的,但还是进入了错误分支,弹出错误对话框,这段代码之前一直是正常的。
但昨天下班前怎么测都是这个结果,后天上班时再去测测看,真是无法理解,郁闷,非常郁闷……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

这个论坛上有人已经发过类似Bug了,最简单的触发方法是:Dim b As Boolean:CopyMemory b,123&,2&  发表于 2011-8-28 15:17
回复 支持 反对

使用道具 举报

发表于 2011-8-28 00:14:12 | 显示全部楼层
本帖最后由 worldy 于 2011-8-28 12:45 编辑

回复 VBProFan 的帖子

not b 也是按位取反
not cbool(b )
=========================

b如果为0,那么not b返回非0,但非(111.....111),判断时候,B会判断为true,not b也会判断为true

点评

正解  发表于 2011-8-28 10:03
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 00:06

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表