用&&和||代替if..else..

2014-11-24 12:10:53 · 作者: · 浏览: 1

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

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

int main ()
{
int a;
1 && ((std::cout << "1") || 1) || (a = 0); //编译通过
return 0;
}
这是因为&&和||只需要判断表达式的值是否为零,所以不存在类型的问题。

呵呵,以上的代码比较有趣。不过在实际工程中,没有人会使用这种晦涩难懂的代码。对于&&和||的这种计算策略,大概知道一下就可以了。


摘自 kof2001kop