Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C switch语句中的随机标签不会导致错误_C_Switch Statement - Fatal编程技术网

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总的来说很差劲,不科学,也不专业,所以我并不感到惊讶。