Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669329
  • 博文数量: 183
  • 博客积分: 9166
  • 博客等级: 中将
  • 技术积分: 1920
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-31 16:17
文章分类

全部博文(183)

文章存档

2010年(159)

2009年(24)

分类:

2009-11-14 07:49:28

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的原理掌握了吧。

阅读(903) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~