我试图理解C中的开关语句(我使用Ubuntuv16.04中的gcc )。我能够理解它的语义,但对它的语法有以下两个问题:
''
括起来,有时却没有。例如:case 1
或case 'a'
。我检查了开关语句(https://linux.die.net/man/1/switch)的Linux,在那里,它们没有为字符串使用“”。因此,我不知道该怎么做,{ }
中,有时则不是。我以前读过,多行语句需要用{ }
括起来,但对于单行语句不一定像在for循环中那样,而循环用单行语句等等。但是有时一条case语句有1行代码(例如a *= 5;
),然后是break
语句(所以总共有2条语句),但是这两行都不包含在{ }
中。Linux手册没有提到这一点。有人能澄清这一点吗?发布于 2019-09-28 19:57:54
(1) a为ascii值97。Ascii是一种编码字符的标准方法,它也在许多其他语言中使用。本质上,每个字符都表示为一个数值。所以当你有:
...
case 'a':
...
如果开关变量等于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;
}
}
这段代码编译。通过将每个案例的代码封装在大括号中,您将为每个案例赋予自己的变量范围,在每个范围中,它可以重新定义同一变量一次。
发布于 2019-09-28 19:55:40
回答你的问题:
q1: 1和1是不一样的。后者被单引号包围,在C语言中,单引号总是表示一个字符.根据C实现,该字符将以ASCII格式存储,数值表示为49。将ASCII格式的字符看作是可以用数字表示的,但数字不能表示,比较'1' == 1
是合法的,因为该字符将被隐式转换为整数。
q2:用大括号包一个箱子是可选的。您可以在任何时候使用大括号声明作用域。更多信息:https://www.geeksforgeeks.org/scope-rules-in-c/,C Switch-case curly braces after every case
发布于 2019-09-28 19:54:33
(1)您询问的是C中的switch语句(特别是gcc),但是您所包含的链接是用于Linux中的switch语句。这是两种不同的语言!在C中,单引号“”用于字符。字符是单个字母/数字/符号/等,而不是一个或多个字符的字符串。因此,case 1:
将匹配数字1,而case '1':
将匹配字符'1‘。数字的类型类似于int或long。字符的类型为char。所以你是否使用'‘取决于你是想匹配一个字符还是一个数字。
(2) {}是不必要的。您可以选择使用它们对代码块进行可视化分组,但不必这样做。还可以使用{}限制变量的作用域。变量范围是一个很大的主题,请参阅以下内容以获得更多信息:https://www.w3schools.in/c-tutorial/variable-scope/
https://stackoverflow.com/questions/58149682
复制相似问题