1、简单例子以及容易产生的“理解”
逻辑判断公式中,常常见到条件相*或相+,也常见到and和or,比如:
=if(and(A1>0,A1<8),B1,C1)……VS……=if((A1>0)*(A1<8),B1,C1)——对比and和*
=if(or(A1>0,A1<8),B1,C1)……VS……=if((A1<0)+(A1>8),B1,C1)——对比or和+
以上两种情况是完全可以互换的(等价的)。由此,初学函数的朋友就容易产生这么一种理解:“*就是and(而且的意思)+就是or(或者的意思)”
在某种意义上来说快速地解读公式含义的话,这个“理解”听起来最容易接受了。但不要由此就把这种逻辑判断中的理解扩散成“完全等价”!请看下一点:
在以下两个条件求和中:(数组公式,按Ctrl+shift+enter结束)(假设A1=4,A2=21;B1=5,B2=11)
=sum(if(and(A1:A2>0,A1:A2<8),B1:B2))……VS……=sum(if((A1:A2>0)*(A1:A2<8),B1:B2))
前者只有当A1、A2都介于0和8之间时才返回B1:B2的和,否则得到0;
后者则分开了,比如A1介于0和8之间,A2不介于0和8之间,那么求得的结果是B1的和,而不是0。
这只是一些显性的数组公式,还有不少用数组运算的公式(非数组公式,不按三键)
2、and、or与*、+的原理比较:
AND(logical1,logical2, ...)——详见and函数帮助:当所有的logical们都为True时返回True——这是1个单值;
OR(logical1,logical2, ...)——详见and函数帮助:当所有的logical们只要有一个为True时返回True——这是1个单值;
(A1:A2>0)*(A1:A2<8)——返回的是{True;False}*{True;True}类型的数组相乘的结果{1;0}——这是一个数组;
(A1:A2>0)+(A1:A2<8)——返回的是{True;False}+{True;True}类型的数组相乘的结果{2;1}——这是一个数组;
接下来:
由and、or得到的是:
=sum(if(and(A1:A2>0,A1:A2<8),B1:B2))=sum(if(and({True;True},{True;False}),B1:B2))=sum(if(False,B1:B2))=0
and({True;True},{True;False})——有出现False返回False;or公式类似。
由*、+得到的是:
=sum(if({1;0},B1:B2))=sum({5;False})=5——可以用F9键在编辑栏看出。
而=sum(if({2;1},B1:B2))=sum({5;11})=16
注:在逻辑判断if的条件中,0=False;非0的数值都=True
从以上的对比可以看出:运算符*和+在逻辑判断中与and和or是不同的,尤其是数组运算的情况下是不能互换的。
——2006-4-12整理