在C语言语言的if语句中安排2乘2条件

时间:2016-08-03 03:48:26

标签: c++ c

编程时,我通常会将两组条件组合在一起,例如:

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 ++中编码,如果重要的话。

3 个答案:

答案 0 :(得分:5)

两种情况不一样。在第二种情况下,AB将分别进行一次评估。在第一种情况下,AB会根据其值进行多次评估。

虽然这几乎肯定不会影响典型案例的优化,但如果AB有副作用,则很重要。

答案 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更具可读性, 但这是我个人的观点,这两个功能都应该这样做。

所以是的,就可读性而言,尽量避免嵌套。