我正在尝试理解C中的switch语句(我正在使用Ubuntu v16.04中的gcc)。我能够理解它的语义,但是对它的语法有以下两个问题:
我在阅读了一些switch语句用法示例后发现,大小写后的符号有时包含在''
中,有时没有。例如:case 1
或case 'a'
。我检查了Linux手册页中的switch语句(https://linux.die.net/man/1/switch),但那里没有使用''作为字符串。所以我不知道该怎么办。
有时,单个案例中的代码块包含在{ }
中,有时却没有。我之前已经读过,多行语句需要包含在{ }
中,但不一定要像for循环中那样包含单行语句,而单行语句中则是while循环,等等。但是有时case语句中有1行代码(例如a *= 5;
)后跟break
语句(因此共有2条语句),但两行都未包含在{ }
中。 Linux手册页没有提到这一点。有人可以澄清吗?
(1)'a'是ascii值97。Ascii是一种编码字符的标准方法,它也在许多其他语言中使用。本质上,每个字符都表示为一个数值。因此,当您有:
...
case 'a':
...
您实际上是在以下情况下执行代码,如果switch变量等于97。在您的示例中:
case '1':
检查开关变量是否等于char'1',即ascii值49。
((2)用大括号括起来的case语句会更改大括号之间的变量范围。考虑以下示例:
switch (sw) {
case 1:
int b = 2;
sw += b;
break;
case 2:
int b = 3;
sw += b;
break;
default:
break;
}
这是因为在情况1和情况2中,您实例化了一个称为“ b”的整数。由于两个case语句都在同一变量范围内(switch语句的范围),因此编译器会给您一个错误,因为您实例化了具有相同名称和两次的变量。现在考虑下面的代码:
switch (sw) {
case 1: {
int b = 2;
sw += b;
break;
} case 2: {
int b = 3;
sw += b;
break;
} default: {
break;
}
}
此代码进行编译。通过将每个案例的代码括在花括号中,可以为每个案例提供自己的变量范围,在此范围内可以在每个范围中重新定义相同的变量。]>
要回答您的问题:q1:1和“ 1”不相同。后者被单引号引起来,在C中始终表示一个字符。根据C的实现,此字符将以ASCII格式存储,并以数字表示49。将ASCII格式的字符看作是可以数字表示的功能,但数字不是,比较'1' == 1
是合法的,因为该字符将被隐式转换为整数。
((1)您在询问有关C语言中的switch语句(特别是gcc)的信息,但是您所包含的链接用于Linux shell中的switch语句。这是两种不同的语言!在C语言中,单引号''用于字符。字符是单个字母/数字/符号/等,而不是一个或多个字符的字符串。因此,case 1:
将匹配数字1,而case '1':
将匹配字符“ 1”。数字的类型如int或long。字符的类型为char。因此,是否使用“”取决于您要匹配的是字符还是数字。
[C中没有用于switch
的手册页。您正在查看的是switch
命令的手册页(按照名称中的(1)
,完全不同。