【问题标题】:Syntax of switch statement in C?C中switch语句的语法?
【发布时间】:2019-09-28 19:35:40
【问题描述】:

我试图理解 C 中的 switch 语句(我正在使用来自 Ubuntu v16.04 的 gcc)。我能够理解它的语义,但对它的语法有以下两个问题:

  1. 在阅读了几个 switch 语句用法示例后,我注意到 case 后面的符号有时包含在 '' 中,有时则不是。 例如:case 1case 'a'。 我检查了 Linux 手册页中的 switch 语句 (https://linux.die.net/man/1/switch),他们没有使用 ' ' 作为字符串。所以我不知道该怎么办。

  2. 有时单个案例中的代码块包含在{ } 中,有时则不是。我之前读过,多行语句需要包含在{ } 中,但对于单行语句来说不一定是 for 循环,while 循环与单行语句等。但有时一个 case 语句有 1 行代码(例如a *= 5;)后跟break 语句(总共2 条语句),但这两行都没有包含在{ } 中。 Linux 手册页没有提到这一点。有人可以澄清一下吗?

【问题讨论】:

  • 使用case 1: 查找等于1 的switch 表达式。使用case '1': 查找开关表达式等于字符'1' 的代码点,这通常等同于(但比case 49: 更清晰)。
  • case 标签后的大括号是可选的,但如果您想在之后立即声明变量,则这是必需的——您不能标记变量声明。在 C99 或更高版本中,您可以在 case 标签之后的语句序列中间声明变量,但不使用大括号这样做会对变量的范围产生有趣的影响。
  • switch 的 linux 手册页与 C 语言没有任何关系
  • 注意'a' 不是字符串,而是int 类型的单个字符。在 C 中,您不能将字符串用于 case 语句。
  • 如果你想看看 switch 语句的一些奇怪用法,看看 Duff 的设备。

标签: c switch-statement


【解决方案1】:

(1) 'a' 是 ascii 值 97。Ascii 是一种标准的字符编码方式,它也用于许多其他语言。本质上,每个字符都表示为一个数值。所以当你有:

...
case 'a':
...

如果 switch 变量等于 97,您实际上是在执行 case 下面的代码。在您的示例中:

case '1':

检查 switch 变量是否等于 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;
    }
}

此代码编译。通过将每个案例的代码括在大括号中,您为每个案例提供了自己的变量范围,它可以在每个范围内重新定义相同的变量一次。

【讨论】:

    【解决方案2】:

    回答您的问题:
    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

    【讨论】:

      【解决方案3】:

      (1) 您询问的是 C 中的 switch 语句(特别是 gcc),但您包含的链接是 Linux shell 中的 switch 语句。这是两种不同的语言! 在 C 中,单引号 '' 用于字符。字符是单个字母/数字/符号/等,而不是一个或多个字符的字符串。所以case 1: 将匹配数字1,case '1': 将匹配字符'1'。数字的类型类似于 int 或 long。字符的类型为 char。因此,是否使用 '' 取决于您尝试匹配字符还是数字。

      (2) { } 不是必需的。您可能会选择使用它们对代码块进行可视化分组,但您不必这样做。您还可以使用 { } 来限制变量的范围。变量范围是一个很大的话题,更多信息请参见:https://www.w3schools.in/c-tutorial/variable-scope/

      【讨论】:

        【解决方案4】:

        C 中使用的 switch 没有手册页。您正在查看的是 switch 命令的手册页(根据名称中的 (1)),完全不同。

        1. case 需要对字符常量使用单引号,对非字符常量不要使用单引号。

          例如,case '1': 检查字符 '1'(通常为整数 49),case 1: 检查整​​数值 1

        2. 花括号主要是一种风格偏好。有些人认为花括号使他们的代码看起来更好和/或更清晰,而有些人则不然。除了范围没有区别。

          这允许您在单个 case 标签中定义一个变量,这样您就不会使其可用于整个函数或 switch 语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-24
          • 2011-11-27
          • 1970-01-01
          • 2016-07-12
          • 2015-01-08
          • 2018-01-11
          相关资源
          最近更新 更多