and和or

fleuria » 24 Mar 2009

在elephas同学的blog那里看到lua的一条小trick, 可以替代C中的(a==1) ? "one" : "not one" , 而且貌似还更符合英语的语法.

a=1
b=(a==1) and "one" or "not one"
print(b)

试了一下, 发现在ruby和python也同样可以使用这种写法. 解释器/编译器貌似是出于优化的目的, 在处理and运算符时, 如果and左端的逻辑表达式如果为假, 解释器就可以直接得到整个and为假, 而不用执行会右边的表达式. 与之相似, 在处理or运算符的时候, 若左端的表达式为真, 解释器就直接返回真而不会执行右边的表达式.

这听起来像是无聊的语法把戏罢了, 不过在php中, 你可能会经常遇到像这样的代码:

mysql_connect($dbname,$dbuser,$dbpass) or die("dbconnect error!");

呵, 有点ruby里面的rescue语句的样子, 实际上这就是一套朴素的错误处理了. mysql_connect函数如果成功, 就会return 1; 如果出错, 就return 0; 将mysql_connect放在if里是完全可以的, 但我觉得在后面跟个or可能更好看些. 现在的php貌似已经有了一套标准的错误处理机制, 不过php的代码又何时有过标准呢? :)

update: 在编译原理里貌似有提到这东西,标准的名字是“短路表达式”

hosted on github, and powered by jekyll. (rss)