switch问题
又发现了一个有趣的问题,呵呵......
下面把问题和解答详细列出来,好好学习了,看来光学C不懂汇编,还是不能深入理解C语言的底层机制呀!
问题提出:
1. #include
2.
3. int main(void)
4. {
5. int i = 1;
6. switch (i)
7. {
8. int c = 10;
9. case 1: printf("%d\n", c);
10. }
11. return 0;
12.}
这段代码中, 结果是c为一个随机值.
从汇编上看语句int c = 10; 没被执行, 那为什么打印c时不报错了?
请问变量c是在何时被声明的, 编译器在这个过程中做了什么呢?
解答:
1.编译器应该先为局部变量分配空间,但是不会赋值,当程序执行到其对应的语句时,才会赋值。
2.gcc -S ....
"c"在栈上定义,没有被初始化,这是编译器优化的结果,为什么编译器会这么做?
switch...case通过cmpl后jmp到case后语句, switch到第一个case间的代码肯定不会执行
3.如果在break后下一个case前加上任何代码都是不会执行的,会被编译器优化掉,这与switch...case语
句的执行顺序是有关的,通过汇编可以看出,switch...case中用的是跳转!
比如下面这样:
switch(...)
{
case 1:
break;
int a = 10; <- 同理a也在栈中定义,无初值
printf("xxxxxx\n"); <- 也被优化掉
case 2:
break;
}
4.做一个测试
int c = 10;
case 1:
printf("first
c=%d\n",c);
c = 90;
printf("c=%d\n", c);
运行的结果:first c=随机值
c=90
由此可见,int c=10没有被执行,c =
90被执行了。
PS:哈哈,switch...case的原理掌握了吧。
阅读(931) | 评论(0) | 转发(0) |