为什么我可以将一个案例放在switch语句中的另一个案例中?

问题描述 投票:9回答:3

以下是switch声明的示例。我不知道它为什么这样工作:

int main(){

    int number1 = 100, number2 = 200;

    switch(number1){
        case 100:{
            cout << " outer switch number is: " << number1 << endl;
        case 200:{ // any value other than 100
                cout << "inner switch number is: " << number2 << endl;
            }
            break;            
        }
        break;    
    }

    return 0;
}
  • 上面的程序打印:100然后打印下一个case 200声明。此外,如果在第二种情况下使用除200之外的任何值,它仍然会被执行。我知道在break之后没有case 100。但是为什么我不会得到编译时错误呢?
  • 为了更清楚,为什么内部案例中的任何其他价值也会成功?例如。, case 70000:
c++ switch-statement
3个回答
9
投票

但是为什么我不会得到编译时错误呢?

因为你没有做任何违法的事情。案例陈述只是一个带标签的陈述。评估开关中的表达式以确定要跳转到哪个标签(注意“jump”和“label”)然后该语句开始执行。说实话,这只是伪装的转换。它有点受限制,但仍然是一个跳跃。

唯一的约束,因为这是C ++,你可能不会跳过对象的初始化跳过它。

这个特征在Duff's Device中使用(尽管在C中)。

更清楚的是,为什么内部案例中的任何其他价值也会成功?

因为在执行跳转之后,这些标签无关紧要。他们只标记具体的陈述。跳转后,执行正常进行。正常执行不会因为标记而避免使用特定语句。


1
投票

为什么你没有看到任何编译错误?这是因为你正确地使用了switch表达式。但是,您可能无法按需查看结果。首先让我们尝试一个简单的switch表达式:

switch(number1){
    case 100:
        cout<<"the number is 100"<<endl;
        break;
    case 200:
        cout<<"the number is 200"<<endl;
        break;
    default:
        cout<<"the number is neither 100 nor 200"<<endl;
        break;
} 

如果要使用其他数字,可以添加到switch-case块。如果你不使用中断意味着下一个案例是目标。直到你不使用休息程序将继续。 default说,如果不发生以上情况,我想做这部分。

我们来看看你的计划以及发生了什么:

switch(number1){
    case 100:{//if the number is 100 it will start from here
        cout << " outer switch number is: " << number1 << endl;
        //it will break after the first break expresion
    case 200:{ // any value other than 100// if the number is 200 it will start from here
            cout << "inner switch number is: " << number2 << endl;
        }
        break; // I meant her is the first break    
    }
    break;    
}

0
投票

switch语句的作用类似于if语句,但在处理超过2或3个选项时它更受欢迎。

switch评估case陈述中的条件。因此,每当它找到一个案例时,它认为它是一个条件,所以它继续执行,直到发现一个中断作为语句结束的标志。在你的情况下case 100开始,但另一个案件在里面,所以只要100你没有休息,其后的一切都被执行。

case 100:
    // do some stuff 
    case 0:
       // do another stuff
    case 5779:
       // do ....
 break;

如果只有case 100成功,以上陈述将被执行。

记住在C ++中你可以写:

void foo(){
    cout << "foo" << endl:
}

int main(){

    b:
        foo();        

    return 0;
}

它像label,但只有关键字case。你可以说一个case内部案例没有它的switch或先前的break将工作与label工作相同的方式。

© www.soinside.com 2019 - 2024. All rights reserved.