编程时,我通常会将两组条件组合在一起,例如:
if (A && B){...}
else if (!A && B){...}
else if (A && !B){...}
else if (!A && !B){...}
也可以使用嵌套的if语句解析它。
if (A){
if (B) {...}
else {...}
}
else {
if (B) {...}
else {...}
}
编辑:一些新的想法,我首先评估A和B并存储为临时变量(然后作为第一种方法),以防A和B的评估都没有副作用?
所以我的问题是它们之间有什么性能差异以及它们的可读性呢?
我在C ++中编码,如果重要的话。
答案 0 :(得分:5)
两种情况不一样。在第二种情况下,A
和B
将分别进行一次评估。在第一种情况下,A
和B
会根据其值进行多次评估。
虽然这几乎肯定不会影响典型案例的优化,但如果A
或B
有副作用,则很重要。
答案 1 :(得分:2)
没有办法预测编译器在这种情况下会选择哪种代码生成策略(实际上它可能取决于周围环境)。这使得您的问题在一般情况下无法解决。通常应该期望编译器足够聪明以识别两个构造的等价性(假设它们确实等效)并自动选择最佳构造。
最优化的代码生成策略可能完全不同,例如。
// Assuming A and B are either 0 or 1
switch ((A * 2) + B) {
case 0: ...; break;
case 1: ...; break;
case 2: ...; break;
case 3: ...; break;
}
只需选择使您的代码更具可读性的任何内容。
答案 2 :(得分:0)
这是一个难题;老实说,我认为每个人都会对此有所不同。正如人们在这里提到的那样无关紧要,因为编译器应该为生成相同的输出(应该!不一定会 - 它实际上取决于代码)。
然而,例如,让我们看看这段代码:
int Nested(int a)
{
if(a > 0)
{
if( a > 1)
{
if( a % 2 == 0)
{
if( a % 10 == 4)
{
printf("a is valid");
return 1;
}
else
{
printf("a's last digit inst 4");
}
}
else
{
printf(" a is not odd");
}
}
else
{
printf(" a is not bigger than 1");
}
}
else
{
printf(" a is not bigger than 0");
}
return 0;
}
int NotNested(int a)
{
if(a <= 0)
{
printf(" a is not bigger than 0");
return 0;
}
if(a <= 1)
{
printf(" a is not bigger than 1");
return 0;
}
if(a % 2 != 0)
{
printf(" a is not odd");
return 0;
}
if( a % 10 != 4)
{
printf("a's last digit inst 4");
return 0;
}
printf("a is valid");
return 1;
}
我个人认为我的例子中的NotNested
更具可读性,
但这是我个人的观点,这两个功能都应该这样做。
所以是的,就可读性而言,尽量避免嵌套。