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 块中的显示函数。为什么会出现这种情况?
编译器可能正在重新排列源语句,折叠其基本块。然后,调试器会将两种情况下对
display()
的调用匹配到相同的源代码行号。当启用优化时,这是常见的情况。
当您的编译器在两种不同的情况下看到相同的函数调用时,它可能会进行一些奇特的优化。检查您的编译器标志,和/或向
display()
添加一些不同的参数,以查看它是否真的按照您指定的方式调用。
编译器转换代码以使其更加高效。当您尝试调试时,这可能会令人困惑,因此您应该关闭优化(如何执行此操作取决于您的编译器或 IDE)。
如果您在代码中注意到,在
printf
语句之后 case 1
和 case 2
是相同的,那么您应该意识到,仅调用一次 display
可能会更有效——其中一种情况将只需跳转到另一种情况的最后一条语句,程序的结果是相同的。
不过,你可以走得更远。由于
case 1
和 case 2
之间唯一真正的区别是打印的字符串,因此除了设置指向将打印的字符串的指针的一点代码之外,您只能拥有整个代码块的一个副本。