短路求值
短路求值(Short-circuit evaluation; minimal evaluation; McCarthy evaluation; 又称最小化求值)[1],是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。例如,当AND的第一个运算数的值为false时,其结果必定为false;当OR的第一个运算数为true时,最后结果必定为true,在这种情况下,就不需要知道第二个运算数的具体值。在一些语言中(如Lisp),默认的逻辑运算符就是短路运算符,而在另一些语言中(如Java,Ada),短路和非短路的运算符都存在。对于一些逻辑运算,如XOR,短路求值是不可能的。 短路表达式 C语言和C++C語言和C++語言標准強制規定了 char* pChar = 0;
// some actions which may or may not set pChar to something
if ((pChar != 0) && (*pChar != '\0')) {
// do something useful
}
C99語言標準的Section 6.5.13 Logical AND operator規定: (4). Unlike the bitwise binary & operator, the && operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares equal to 0, the second operand is not evaluated. 翻譯:於二元位與運算符&不同,&&運算符保證從左到右求值,第一操作數求值後有一個順序點。如果第一操作數比較等於0,則第二操作數不再求值。 類似地,section 6.5.14 Logical OR operator有類似規定。C++語言標准有同樣規定。但如果重載了 考慮以下使用C语言寫的例子: int a = 0;
if (a && myfunc(b)) {
do_something();
}
在這個例子中,最小化計算使得 void * p = NULL;
int ret;
/* ... */
if(p && ret = func(p) ){
/* 或者另一種更清晰的寫法是if( (p != NULL) && (ret = func(p)) ) */
/* ... */
}
/* ... */
當使用最小化計算時,很重要的一點是得知表示式取值的順序。某些編程語言中確保有一致的取值順序。例如:C语言、Java、Perl、Python和Ruby等。 它不過是下面語句的一種更加緊湊的表示形式罷了。 if (cond_a) {
if (expensive_or_dangerous_cond_b) {
...
}
}
註釋
參考文獻
参閲外部連結 |