在C++中,像這樣的表達式:expression1 && expression2
如果expression1的值為零時,整個&&表達式就會結束,也就是說不會再去計算expression2了。
&&表達式的這種計算策略,叫作短路求值(More Effective C++中叫作“驟死式”)。
其實,如果我們利用這個特性,就可以用&&和||來代替if..else..。
if..else版本:
if (expression1)
{
expression2;
}
else
{
expression3;
}
&&和||版本:
expression1 && (expression2 || 1) || expression3;
?:版本:
expression1 ? expression2 : expression3;
以上三個版本中,?:版本最具有局限性。比如下面這段代碼:
#include <iostream>
int main ()
{
int a;
if (1)
std::cout << "1";
else
a = 0;
return 0;
}
如果換成?:版本的,就會出錯:
int main ()
{
int a;
1 ? (std::cout << "1") : (a = 0); //編譯出錯
return 0;
}
出錯原因是因為語法規定?:中:兩邊的值的類型要一致。所以說,這就是?:的局限性。
但如果換成&&和||,卻並沒有這種局限:
#include <iostream>
int main ()
{
int a;
1 && ((std::cout << "1") || 1) || (a = 0); //編譯通過
return 0;
}
這是因為&&和||只需要判斷表達式的值是否為零,所以不存在類型的問題。
呵呵,以上的代碼比較有趣。不過在實際工程中,沒有人會使用這種晦澀難懂的代碼。對於&&和||的這種計算策略,大概知道一下就可以了。