切换vs如果...否则...如果...否则

时间:2018-07-03 11:19:04

标签: c

我有一个问题。我正在为考试而学习,我不知道该怎么做。基本上,我必须将if ... else if ... else否则的指令更改为指令开关,以使程序的输出保持不变。

void main()
{
    int x;
    x = 1;
    for (int i = 1; i < 10; ++i) {
        if (i <= 3)
            do {
                x += i;
                if (x >= 4)
                    break;
            } while (i % 2 == 0);
        else if ((i > 3) && (i < 5))
            x += 2;
        else
            continue;
    }
    while (x > 0) {
        printf(" x=%d ", x);
        x -= 1;
    }
    system("pause");
}

我可以在for循环内进行切换吗?

3 个答案:

答案 0 :(得分:5)

当然可以。 for循环控制语句的执行,而switch的声明。

鉴于i在1到9的范围内,可以将if块替换为

switch (i){
case 1: case 2: case 3:
    // that replaces 'if (i <= 3)'
    // ToDo - the code here
    break; // to obviate follow-through.
case 4:
    // that replaces 'if ((i > 3) && (i < 5))'
    // ToDo - the code here
    break;
default:
    // that replaces 'else'
    continue; // note that this is for the for loop, not the switch
}

请注意,此重构不会更改if (x >= 4) break;的行为。

但是我不认为用if替换switch块是正确的做法:边界i <= 3i >= 5的处理不太自然switch;也许将i的类型更改为unsigned并显式处理case 0:会有所缓解。

答案 1 :(得分:2)

类似的事情应该起作用

void main()
{
    int x;
    x = 1;
    for (int i = 1; i < 10; ++i) {
        switch (i) {
            case 1:
            case 2:
            case 3:
                 do {
                     x += i;
                     if (x >= 4)
                         break;
                 } while (i % 2 == 0);
                 break;
            case 4:
                 x += 2;
                 break;
            default:
                continue;
                break;
         }
    }
    while (x > 0) {
        printf(" x=%d ", x);
        x -= 1;
    }
    system("pause");
}

答案 2 :(得分:0)

您可以在循环内部使用switch语句。

IMO switch比长if else序列更具可读性。性能几乎相同。

某些编译器(例如gcc)具有开关扩展名,从而使switch语句中的范围检查更短。

switch(age)
{
    case 0 ... 12:
    printf("Child\n");
    break;
    case 13 ... 19:
    printf("Teenager\n");
    break;
    case 20 ... 200:
    printf("Adult\n");
    break;
    default:
    printf("Immortal\n");
    break;
} 

它当然不是便携式的。