【发布时间】:2010-12-17 05:00:31
【问题描述】:
相关问题:Benefits of using short-circuit evaluation、Why would a language NOT use Short-circuit evaluation?、Can someone explain this line of code please? (Logic & Assignment operators)
对于使用短路代码的语言的好处存在疑问,但我想知道对程序员有什么好处?只是它可以让代码更简洁一点吗?还是有性能原因?
我不是在询问需要评估两个实体的情况,例如:
if($user->auth() AND $model->valid()){
$model->save();
}
对我来说,其中的推理很清楚 - 因为两者都需要为真,如果用户无法保存数据,您可以跳过成本更高的模型验证。
这也有一个(对我来说)明显的目的:
if(is_string($userid) AND strlen($userid) > 10){
//do something
};
因为使用非字符串值调用strlen() 是不明智的。
我想知道的是在不影响任何其他语句的情况下使用短路代码。例如,来自 Zend Application 默认索引页面:
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
这可能是:
if(!defined('APPLICATION_PATH')){
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
}
或者甚至作为一个单一的陈述:
if(!defined('APPLICATION_PATH'))
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
那么为什么要使用短路代码呢?只是为了使用逻辑运算符代替控制结构的“酷”因素?合并嵌套的 if 语句?因为它更快?
【问题讨论】:
-
关于速度的一点说明:如果你有一个中规中矩的编译器,它将为 if 语句和短路生成相同的机器代码。如果你不这样做,它会产生足够糟糕的代码,以至于一些源级微优化的几个额外周期将在噪音中丢失。很简单,这并不重要。
-
@David 对于脚本语言也是这样吗?
-
@TimLytle 在解释语言中,由于要进行不同的解析和解释,您可能会有不同的行为。在代码有机会运行之前,编译器可以从中受益。
-
控制结构给人的印象是正在采取一些行动。短路给人的印象是正在评估表达式。我觉得短路经常被用来帮助开发人员知道除了评估最终值(没有副作用等)之外没有任何事情发生。
标签: coding-style short-circuiting code-structure