表达式的求值顺序

在C等高级语言中,对表达式求值时一般都有一套较为固定的规则。例如按照从左到右的顺序求值,如果算到某处可以得出结果就忽略后续的表达式(Short Circuit)。举个例子:   x = 1; if (x != 0 && foo())   先计算 x != 0,无法得出整个表达式的结果,此时还得计算 foo(),将两个结果&&起来才能得到最终结果。但是:   x = 1; if (x != 0 || foo())   在计算完 x != 0 之后,无需计算 foo(),就可以知道表达式的最终结果为 true 了。因此,foo()的求值完全可以被优化而省略掉。   如果你的程序非要依赖 foo() 函数计算过程中对某个变量改变后的结果(Side Effect),那程序出错就只能怪自己了。   在 SQL 语言中,也存在类似的现象。不过SQL语言计算表达式时是没有从左到右或从右到左的规则的。例如:   select * from foo where age > 0 or blah / age > 3   系统完全可能先算 age > 0,也可能先算 blah / age > 3。也可能两个都算了。而如果将上面的 or 换成 and:   select * from foo where age > 0 and blah / age > 3   如果存在 age 为零的记录,并且 age > 0 后算,则系统会报出“被零除”之类的错误。    

[ SQL ]
Written on March 11, 2010