回 帖 发 新 帖 刷新版面

主题:[讨论]逻辑表达式的先后顺序

VB代码:
[quote]Do While MsgBox("abc", vbYesNo, "YES") = vbYes And MsgBox("DDD", vbYesNo, "YES") = vbYes
    MsgBox ("KKK")
Loop[/quote]

从这个程序可以看出来,
VB并没有优化的去判断条件,
虽然是 and 条件,
但仍将所有条件值从左到右都计算出结果后再进行 and 运算
未免有点浪费,而且失去了一些容错的判断优势.

在VFP里则不同,
会从左到右判断,而且会参照逻辑运算的符号,
如果是 or ,第一个条件成立了就不会去计算第二个条件了.
同样道理, and 的第一个条件不成立也就不会再去管第二个条件了.
这时候,一些复合条件以及容错表达式就得到了很好的处理.
比如:
do while vartype(T1)=2 and T1+T2 > 36 诸如此类

VB例子:(出错)
[quote]T1 = 9
T2 = 31
Do While VarType(T1) = 2 And T1 + T2 > 36
    MsgBox ("KKK")
    T1 = "ABC"
Loop[/quote]

VFP例子:(容错)
[quote]T1=9
T2=31
DO WHILE VARTYPE(T1)="N" AND T1+T2>36
    MESSAGEBOX("KKK")
    T1="ABC"
ENDDO[/quote]

知道了VFP的这个对逻辑表达式的判断特点后,
我去对SQL的条件进行了肤浅的尝试,
也许是因为我的数据太过简单了,
所以也希望大家能多些参与测试一下以验证经验.

我在26万的数据表当中(刻意放大的重复数据)
特意的使用了一些查询困难的条件,                            结果            时间
select ..... where at("电话",资料)>0                      110000            2秒
select ..... where day(日期)=1                             7000             1秒
select ..... where at("电话",资料)>0 and day(日期)=1       6000             2秒
select ..... where day(日期)=1 and at("电话",资料)>0       6000             1秒

这些条件跟索引没有关系,
也跟Rushmore 技术的SET Optimize设置无关,
起决定作用的是,相关条件的先后顺序.
在 and 逻辑里,第一个条件不成立,就跳过,不用检测第二个条件
在 or  逻辑里,第一个条件成立,就跳过第二个条件,
那么,现在大家知道我在说什么了吧?

大家用自己手上的海量表测试一下,看是不是这个道理.

回复列表 (共8个回复)

沙发

[quote]在VFP里则不同,
会从左到右判断,而且会参照逻辑运算的符号[/quote]

注意:逻辑表达式不是单纯的,从左到右云算的。

板凳

逻辑表达式是按照布尔代数的规定,其先后顺序是:not、 and、 or

3 楼

没有功劳,也有苦劳.

4 楼


哈. 我理解错了?

5 楼

不要稀哈.(:

6 楼

?MESSAGEBOX("1",3)=6 or MESSAGEBOX("2",3)=6 and not MESSAGEBOX("3",3)=6

同意    "逻辑表达式是按照布尔代数的规定,其先后顺序是:not、 and、 or"

不同意  "注意:逻辑表达式不是单纯的,从左到右云算的。"

7 楼

逻辑运算是按照布尔代数的规则进行运算滴,其实和加减乘除四则运算类似。

 但有区别:若是或运算,左边=.t.就不再对右边的东东进行运算,若是与运算,左边=.f.就不再对右边的东东进行运算,因为布尔代数的结果只有0和1。

8 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

您尚未登录,请登录后再回复。点此登录或注册