符号":" C 和 C++ 中是什么意思?

What does the symbol ":" mean in C and C++?

本文关键字:是什么 意思 符号 C++      更新时间:2023-10-16

那么为什么开关大小写使用冒号":"?难道不能这样写

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

那么,为什么":"与开关和外壳一起使用呢?

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

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

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

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

基本上,大多数在 C 和 C++ 中跳来跳去都是基于块和关键字

的。无论块定义如何,goto都可以跳转到函数中的任何任意标签(C++有话要说,你可以"任意"跳来跳去。虽然switch语句只能跳转到其自身块内的不同case/default位置,并且只能跳转到一个这样的位置,但这些位置不会创建范围(就像我们有时希望的那样(。这些位置不定义独占代码的部分;执行直接通过标签传递(这就是为什么break语句通常与case/default一起使用的原因(。

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

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

printf("x1n");
goto target;
printf("x2n");
target:
printf("x3n);

会打印出来:

x1
x3

它还用于指定开关/机箱块中的跳转目标:

switch(someVal)
{
case 1:
printf("1n");
break;
case 2:
printf("2n");
break;
default:
printf("Something elsen");
break;
}

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

开关大小写结构中的 : 通常标记大小写标签的结尾。也就是说,当一个案例被定义为案例 1 时:这意味着 : 表示案例内案例构造的标签的结束,任何语句或方法都可以执行。

例如:

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

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

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

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