如果在开关机箱内,则限制机箱

if inside a switch case, to restrict cases

本文关键字:机箱 开关 如果      更新时间:2023-10-16

感谢您的回答。

我想知道是否可以使用条件表达式限制 swtich-case 语句的某些情况。像下面的代码一样。

switch(a)
{
    case 1:
    {
        do_1();
        break;
    }
    case 2:
    {
        do_2();
        break;
    }
    if(condition)
    {
        case 3:
        {
            do_3();
            break;
        }
        break;
    }
}

编辑,对不起,伙计们,我得到了错误的条件,它与切换变量完全无关。只是另一个条件,外部条件。我只想知道我是否可以限制具有外部条件的情况,否则,如果不满足条件,则不会分析IF内部的情况。
我需要在 if 内进行第二次休息吗?

简短的回答是否定的。您必须颠倒顺序:

case 3: 
    if (condition) 
        do_3();
    break;

检查每种情况下的条件:

switch(a) 
{ 
    case 1: 
    { 
        do_1(); 
        break; 
    } 
    case 2: 
    { 
        do_2(); 
        break; 
    } 
    case 3: 
    { 
        if (condition) 
            do_3(); 
        break;
    } 
    case 4: 
    { 
        if (condition) 
            do_4(); 
        break;
    } 
} 

或者使用带有第二个switchdefault块:

switch(a) 
{ 
    case 1: 
    { 
        do_1(); 
        break; 
    } 
    case 2: 
    { 
        do_2(); 
        break; 
    } 
    default:
    {
        if (condition)
        {
            switch (a)
            {
                case 3: 
                { 
                    do_3(); 
                    break;
                } 
                case 4: 
                { 
                    do_4(); 
                    break;
                } 
            }
        }
        break; 
    }
} 

不,你这样做:

    case 3:
    {
        if (a == condition)
            do_3();
        break;
    }
    break;

可以完成此操作的两种方法是:

  1. 使用预处理器宏,假设您的条件可以通过这种方式进行测试。

    #ifdef condition
        case 3:
        {
            do_3();
            break;
        }
    #endif
    
  2. if 语句移动到case块内。

    case 3:
    {
        if (a == condition)
            do_3();
        break;
    }
    
C++不支持

这一点。 但是,您可以使用函数调用将交换机拆分为多个部分,以减少代码重复。 如果您尝试按照以下思路执行某些操作:

void func()
{
    switch(a)
    {
        case 1:
        {
            do_1();
            break;
        }
        case 2:
        {
            do_2();
            break;
        }
        if(condition)
        {
            case 3:
            {
                do_3();
                break;
            }
            case 4:
            {
                do_3();
                break;
            }
            case 5:
            {
                do_3();
                break;
            }
            break;
        }
    }
}

你可以像这样拆分它:

void func()
{
    if(!func_a(a) && condition)
        func_b(a);
}
bool func_a(a)
{
    switch(a)
    {
        case 1:
        {
            do_1();
            return 1;
        }
        case 2:
        {
            do_2();
            return 1;
        }
        default: return 0;
    }
}
void func_b(a)
{
    switch(a)
    {
        case 3:
        {
            do_3();
            break;
        }
        case 4:
        {
            do_3();
            break;
        }
        case 5:
        {
            do_3();
            break;
        }
    } 
}

你永远无法在那里放置一个if条件,因为它不适用于C++语法。 您应该将 #3 移到 case 语句之外,或者使其成为默认大小写的一部分并检查那里的条件。

它以C++编译。但结果出乎我的意料

#include <iostream>
#include <string>

int test(int action, bool allow_restricted)
{
    int success = -1;
    switch(action)
    {
        case 1:
            std::cout << "Performing " << action << std::endl;
            success = 0;
        break;
        case 2:
            std::cout << "Performing " << action << std::endl;
            success = 0;
        break;
        if(allow_restricted)
        {
            case 3:
                std::cout << "Performing restricted " << action << std::endl;
                success = 0;
            break;
            case 4:
                std::cout << "Performing restricted " << action << std::endl;
                success = 0;
            break;
        }
        default:
        break;
    }
    return success;
}
int main()
{
    test(1,false);
    test(3,false);
    test(3,true);
}

这不是我们想要的输出。

Performing 1
Performing restricted 3
Performing restricted 3

它无法按预期工作,因为 switch-case 语句跳转而不是执行 if 语句。

但是在失败的情况下,if语句有效(在action == 3allow_restricted == false时不起作用(。


int test_fallthrough(int action, bool allow_restricted)
{
    int success = -1;
    switch(action)
    {
        case 1:
            std::cout << "fallthrough " << 1 << std::endl;
            success = 0;
        case 2:
            std::cout << "fallthrough " << 2 << std::endl;
            success = 0;
        if(allow_restricted)
        {
            case 3:
                std::cout << "fallthrough restricted " << 3 << std::endl;
                success = 0;
            case 4:
                std::cout << "fallthrough restricted " << 4 << std::endl;
                success = 0;
        }
        default:
        break;
    }
    return success;
}

int main()
{
    test_fallthrough(1,false);
    test_fallthrough(1,true);
}

输出。

fallthrough 1
fallthrough 2
fallthrough 1
fallthrough 2
fallthrough restricted 3
fallthrough restricted 4

通过开关内部的while回路,它会变得更加有趣。

void test_fun_fallthrough(int action, bool allow_restricted)
{
    bool initialize = false;
    switch(action)
    {
        do
        {
            case 1:
                std::cout << "Fun fallthrough, initializing " << 1 << std::endl;
                initialize = false;
            case 2:
                std::cout << "Fun fallthrough " << 2 << std::endl;
            if(allow_restricted)
            {
                case 3:
                    std::cout << "Fun fallthrough restricted " << 3 << std::endl;
                    if(3 == action)
                    {
                        initialize = true;
                        action = 1;
                    }
                case 4:
                    std::cout << "Fun fallthrough restricted " << 4 << std::endl;
            }
        } while(initialize);
        default:
        break;
    }
}
int main()
{
    test_fun_fallthrough(3,true);
    std::cout << "*********************" << std::endl;
    test_fun_fallthrough(3,false);
}
Fun fallthrough restricted 3
Fun fallthrough restricted 4
Fun fallthrough, initializing 1
Fun fallthrough 2
Fun fallthrough restricted 3
Fun fallthrough restricted 4
*********************
Fun fallthrough restricted 3
Fun fallthrough restricted 4
Fun fallthrough, initializing 1
Fun fallthrough 2

出乎意料的是,即使allow_restricted false,我们也可以跳转到受限制的代码。