表达式的求值顺序

来源:互联网 发布:武汉安天 工作 知乎 编辑:程序博客网 时间:2024/04/30 21:30

      在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 后算,则系统会报出“被零除”之类的错误。

 

 

原创粉丝点击