对两个案例标签使用相同的值与对单个案例使用多个案例标签有什么区别?

what is the difference between using the same value for two case labels and using several case labels for a single case?

本文关键字:案例 标签 单个 区别 什么 两个      更新时间:2023-10-16

我正在用C++阅读Bjarne的编程和原则

我遇到了有关交换机的以下详细信息:

您可以对单个案例使用多个案例标签。

不能对两个事例标签使用相同的值。

我想我清楚地理解了 2. 一。它应该意味着:

switch (a) {
case 'c':{//some code} 
case 'c':{//some (different) code} 
} 

是不合法的。

但是,我不确定第一个是否意味着,如果案例 1 和案例 2 等不同,那么我可以有任意数量的案例(当然它们是常量表达式(,或者这意味着我可以有任意数量的案例,但其中一些做同样的事情

我发现了一个类似的问题: C 开关外壳中的多个标签值

我解释对吗?如果没有,我错过了什么或出错了什么?

这是允许的:

switch ( expression )
{
case 1:
case 2: 
case 3:
//some code
break;
//...
}

这是不允许的:

switch ( expression )
{
case 1:
//some code
break;
case 1:
//some other code
break;
//...
}

似乎他的意思是以下结构

switch ( expression )
{
case 1: case 2: case 3:
//some code
break;
//...
}

您可以对单个案例使用多个案例标签。

这只是意味着在任何情况下,您都可以使用尽可能多的标签。

例如

switch(choice) {
// This is valid
case 1:
case 2:
.
.
case n:
printf("nCase 1 and 2");
break;
}

您可能想知道为同一案例使用多个标签有什么用?

考虑一个询问用户他/她对主题的成绩的示例。用户可以输入A级的Aa等级,B级的Bb等。但是您希望处理忽略用户输入是大写还是小的情况。您可以这样做:

char choice;
printf("Enter your grades : ");
scanf("%d", &choice);
switch(choice) {
case 'A':
case 'a':
printf("Excellent");
break;
case 'B':
case 'b':
printf("Good");
break;
.
.
case 'E':
case 'e':
printf("You failed");
break;
default:
printf("Invalid grades");
}

我认为这是一种措辞不佳的方式,可以说您可以在单个语句上有多个标签(实际上是案例标签或常规标签(,或者换句话说,您可以使用隐式的跌倒。

例:

bool a_or_b_eh(char Ch)
{
switch(Ch){ //return true; is a single statement so the {} are optional here
case 'a': case 'b': case 'A': case 'B': return true;
}
return false;
}