【问题标题】:What does the symbol ":" mean in C and C++? [closed]符号“:”在 C 和 C++ 中是什么意思? [关闭]
【发布时间】:2018-08-13 04:29:04
【问题描述】:

那么为什么 switch case 使用冒号“:”?不能这样写吗-

switch(foo) {
    case 1 {
        do_stuff();
    }
    case 2 {
        do_other_stuff();
    }
    case default {
        do_default_stuff();
    }
}

那么,为什么 ":" 与 switch 和 case 一起使用?

更一般地说,符号“:”在 C 和 C++ 中是什么意思?

我发现的唯一信息是它与goto有关,我认为在c和cpp中不再使用它了。

【问题讨论】:

  • 它标志着一个标签的结束——一个 case 标签(或default)在 switch 的情况下。否则,goto 语句的目标。在switch 中使用它并没有什么特别之处——正如您所发现的,它标志着标签的结束。所以case 1:是一个case标签; : 是标签的结尾。 (还有其他使用单冒号的上下文;在 C++ 中,有许多使用双冒号 :: 的上下文。)

标签: c++ c switch-statement


【解决方案1】:

C 和 C++ 语法中通常使用冒号来表示标签:执行可以跳转到的位置,该位置不是由显式块确定的。

这就是我的意思。在if 语句中,执行将跳过第一个块或else 块。在这两种情况下,都会跳过整个块。在while 循环中,执行跳转到块开始之前,或者在break 语句/条件失败的情况下跳转到块之外。

基本上,C 和 C++ 中的大多数跳转都是基于块和关键字。

goto 可以跳转到函数内的任意标签(C++ 有话要说,你可以如何“任意”跳转),而不管块定义如何。虽然 switch 语句只能跳转到其自己块内的不同 case/default 位置,并且只能跳转到一个这样的位置,但这些位置不会创建 块 范围(就像我们一样d有时喜欢他们)。这些位置不定义专有代码段;执行直接通过标签(这就是为什么break 语句通常与case/default 一起使用)。

简而言之,case/default 的行为更像是标记为 goto,而不是普通的 C 或 C++ 块结构。因此,它们使用相同的语法来表示它们:冒号。

【讨论】:

  • 另外值得一提的是:en.wikipedia.org/wiki/Duff%27s_device
  • @AnttiHaapala 我不同意,我不会向任何人提及 Duff 的设备,尤其是所有新手。手动展开循环并不是一个非常有意义的练习。
  • @Lundin 不,但语法允许这样做
【解决方案2】:

当您阅读时,它用于指定 goto 语句跳转到的目标/标签。例如:

 printf("x1\n");
 goto target;
 printf("x2\n");
 target:
 printf("x3\n);

会打印出来:

 x1
 x3

它也用于在 switch/case 块中指定跳转目标:

 switch(someVal)
 {
    case 1:
       printf("1\n");
    break;

    case 2:
       printf("2\n");
    break;

    default:
       printf("Something else\n");
    break;
 }

至于 为什么 使用它(与其他字符或语法相反),最可能的解释是语法继承自 B language,这是 C 的语言源自。您可以在 this PDF 中看到 B 程序中 goto 和 switch/case 用法的示例,它们看起来非常像 C 语法。

【讨论】:

  • 在 BCPL 中也是如此。
【解决方案3】:

: 在 switch case 构造中通常标记 case 标签的结束。那就是当一个案例被定义为案例 1 时:这意味着 : 表示在案例中任何语句或方法都可以执行的案例构造的标签的结束..

例如:

switch(ch)
{
     case 1:// Completion of case 1 label
           printf("Hello");
           break;
     case 2:// Completion of case 2 label
           printf("World");
           break;
}

【讨论】:

    【解决方案4】:

    : 是语法中称为 labeled-statement 的项目的一部分。存在三种不同的情况,C17 6.8.1:

    labeled-statement:  
      identifier : statement
      case constant-expression : statement
      default : statement
    

    第一种情况identifier : statement 指的是goto 标签,另外两种情况是switch 语句。

    【讨论】:

      猜你喜欢
      • 2016-01-07
      • 2022-01-01
      • 2015-04-05
      • 1970-01-01
      • 2012-12-11
      • 2013-10-25
      • 2010-10-05
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多