c switch 语句

问题描述 投票:0回答:3
void display()
{
    printf("every thing is ok");
}
void main()
{
    int ch;
    while(1)
    {
        printf("enter your choice");
        scanf("%d",&ch);
        switch(ch)

        {
            case 1: clrscr();printf("when choice is one every thing is fine");
                    display();
                    break;
            case 2: clrscr();printf("when chice is two its confusing");
                    display();
                    break;
            case 3: exit(0);
            default: printf("enter choice as 1 or 2 or to exit enter 3");
        }
    }
}

当我跟踪这个 C 程序并输入选项 2 时,它会调用 case 1 块中的显示函数。为什么会出现这种情况?

c switch-statement
3个回答
4
投票

编译器可能正在重新排列源语句,折叠其基本块。然后,调试器会将两种情况下对

display()
的调用匹配到相同的源代码行号。当启用优化时,这是常见的情况。


0
投票

当您的编译器在两种不同的情况下看到相同的函数调用时,它可能会进行一些奇特的优化。检查您的编译器标志,和/或向

display()
添加一些不同的参数,以查看它是否真的按照您指定的方式调用。


0
投票

编译器转换代码以使其更加高效。当您尝试调试时,这可能会令人困惑,因此您应该关闭优化(如何执行此操作取决于您的编译器或 IDE)。

如果您在代码中注意到,在

printf
语句之后
case 1
case 2
是相同的,那么您应该意识到,仅调用一次
display
可能会更有效——其中一种情况将只需跳转到另一种情况的最后一条语句,程序的结果是相同的。

不过,你可以走得更远。由于

case 1
case 2
之间唯一真正的区别是打印的字符串,因此除了设置指向将打印的字符串的指针的一点代码之外,您只能拥有整个代码块的一个副本。

© www.soinside.com 2019 - 2024. All rights reserved.