C switch语句中的随机标签不会导致错误
可能重复:C switch语句中的随机标签不会导致错误,c,switch-statement,C,Switch Statement,可能重复: 我可以编译这段代码而不会遇到任何错误。我认为应该有一个错误,因为switch语句中有assadfsd #include <stdio.h> int main(void) { int choice = 1; goto assadfsd; switch (choice) { case 1: printf("Case 1\n"); break; assadfsd: printf("Er
我可以编译这段代码而不会遇到任何错误。我认为应该有一个错误,因为switch语句中有
assadfsd
#include <stdio.h>
int main(void)
{
int choice = 1;
goto assadfsd;
switch (choice) {
case 1:
printf("Case 1\n");
break;
assadfsd:
printf("Error\n");
}
return 0;
}
为什么编译没有失败
#include <stdio.h>
int main(void)
{
int choice =0;
scanf("%d",&choice);
switch(choice)
{
case 1 :
printf("Case 1\n");
break;
assadfsd :
printf("Error\n");
}
return 0;
}
#包括
内部主(空)
{
int-choice=0;
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
printf(“案例1\n”);
打破
阿萨德:
printf(“错误\n”);
}
返回0;
}
它被称为
e、 g
开关
语句的语法为:
switch ( expression ) statement
所以你可以把任何你想要的语句代替“语句”。这里您使用了一个标签,这是C标准允许的。因此,编译器应该编译代码而不会出错
例如,您可以使用goto
语句使用此标签
#include <stdio.h>
int main(void)
{
int choice = 1;
goto assadfsd;
switch (choice) {
case 1:
printf("Case 1\n");
break;
assadfsd:
printf("Error\n");
}
return 0;
}
#包括
内部主(空)
{
int-choice=1;
后藤阿萨德;
开关(选择){
案例1:
printf(“案例1\n”);
打破
阿萨德:
printf(“错误\n”);
}
返回0;
}
您预计错误会出现在哪里?我同意你的编译器。现在assadfsd:是在一个case语句之后。如果你把警告级别设置得很高,-Wall
或类似的东西,编译器应该告诉你:(1)未使用的标签assadfsd
,(2)无法访问的语句printf(“错误”)
编译器可能会警告无法访问的代码,但这是完全合法的。所以我可以在之前编写任何字符串:compile不会将其视为错误,因为它会将其视为标签only@Anshulgarg-任何字符串都必须是有效标识符,并且标签名称在其出现的函数中必须是唯一的。#include int main(void){int choice=0;scanf(“%d”,&choice);开关(选项){case 1:printf(“case 1\n”);中断;assadfsd:int a=2;printf(“Error\n”);dsefault:printf(“Default”);}返回0;}现在,在本例中,我定义了一个内部标签int,它与c相反,因为在c中,所有变量都必须在函数中声明start@Anshulgarg在c语言中,所有变量都必须在函数开始时声明“不,您几乎可以在任何地方使用它。请注意,这是一种非常糟糕的做法,不应该在实际应用中使用。例如,在MISRA-C中是被禁止的。这取决于具体情况。一旦我在开关
中使用了与case
不同的语句来实现状态机。但我部分同意,因为本文中的示例是一种非常糟糕的风格。不要告诉任何在Linux内核上工作的人。代码中到处都是标签/goto。这是一种常见的做法。@Mike总的来说很差劲,不科学,也不专业,所以我并不感到惊讶。