2014-06-30

Short-Circuit Evaluation

Java在計算boolean運算式時,
會使用short-circuit evaluation的方式,(或稱為lazy evaluation)
代表若該運算式由左至右運算,已經能決定最後的解答時,
則會跳過剩下未計算的部分。

舉個例子來說,
某boolean運算式為:(A>0)&&(B<0),
若A是負值,則(A>0)會得到false,
不管B的值為何,&&運算的結果都是false,
因此Java就會跳過計算(B<0),直接判斷最終結果為false。

同理,對於(A>0)||(B<0)而言,
若A是正值,則(A>0)會得到true,
則不管B的值為何,||運算的結果都是true,
Java就可以省略後面的計算,直接判斷最終結果為true。

而我們也可以使用complete evaluation,
去計算每個判斷式的結果。
要使用complete evaluation的話,
and運算使用的是 & 運算子、or運算使用的是 | 運算子。
(注意: 這邊的 &、| 並非C++的bitwise and/or)

在大部分的情況下,這兩種方式都能得到相同的結果,
然而short-circuit evaluation有時能夠避免run-time error的情形發生。

if ( (A!=0) && ((B/A)>0) );
if ( (A!=0) &  ((B/A)>0) );

如上面的例子,
第1行使用short-circuit evaluation,
當A為0時就會得到false的結果,跳過後面的計算,就不會有B除以0的情形發生;
而第2行使用complete evaluation,
儘管A是0,還是會去計算B/A,則會產生run-time error。

沒有留言:

張貼留言