免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 绿茶主演
打印 上一主题 下一主题

华为面试题真火,来个冒牌的!  关闭 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2006-11-23 23:38 |只看该作者
>> 哈哈,这个用华为面试关的话来说叫代码风格不好
>> 分开几行写不就行了

在程序正确的基础上才能谈及其它,比如代码风格。

(++i)+(++i)+(++i) 是一个无定义的表达式。它的存在表明了这是一个有问题的程序。

论坛徽章:
0
22 [报告]
发表于 2006-11-24 08:49 |只看该作者
  1. [liuqi@ljjk code]$ cat cc.s
  2.         .file   "cc.c"
  3.         .section        .rodata
  4. .LC0:
  5.         .string "%d,%d\n"
  6.         .text
  7. .globl main
  8.         .type   main,@function
  9. main:
  10.         pushl   %ebp
  11.         movl    %esp, %ebp
  12.         subl    $8, %esp
  13.         andl    $-16, %esp
  14.         movl    $0, %eax
  15.         subl    %eax, %esp
  16.         movl    $0, -4(%ebp)     //付值从这里开始i=0;
  17.         movl    $0, -8(%ebp)    //j=0
  18.         leal    -4(%ebp), %eax    //还是i=0(把i原来在的地址存到一个寄存器中 %eax中)
  19.         incl    (%eax)         //%eax中的值自加1
  20.         leal    -4(%ebp), %eax  //把%eax中的自加1的值寻址付值给%eax   这个时候i=1
  21.         incl    (%eax)      //%eax中存的值自加一
  22.         movl    -4(%ebp), %eax  //把%eax中的自加1的值寻址付值给%eax  这个时候i=2
  23.         movl    -4(%ebp), %edx  //把%eax中的自加1的值寻址付值给%edx   这个也是i=2
  24.         addl    %eax, %edx     //%eax+%edx  (++i)+(++i) 这个时候   2+2
  25.         leal    -4(%ebp), %eax  //把%eax中的自加1的值寻址付值给%eax
  26.         incl    (%eax)      //这个时候i=3
  27.         movl    %edx, %eax //把以前的2+2的值给%eax
  28.         addl    -4(%ebp), %eax  //这个时候是3+4
  29.         movl    %eax, -8(%ebp) //把3+4的值给变量j
  30.         subl    $4, %esp //调用函数返回操作,栈指针操作
  31.         pushl   -4(%ebp) //i入栈保护
  32.         pushl   -8(%ebp) //j入栈保护
  33.         pushl   $.LC0 参数"%d,%d"的字符串保护
  34.         call    printf //把上面的保护的参数都扔到这里,就是扔到printf函数里
  35.         addl    $16, %esp
  36.         leave
  37.         ret
  38. .Lfe1:
  39.         .size   main,.Lfe1-main
  40.         .ident  "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
  41. [liuqi@ljjk code]$
复制代码



但愿我没有误人子弟
其实前辈们传授技术经验要好好的考虑和辨别好坏的,我觉得技术上的可以去吸取别人的,这样才会有进步,否则不要说华为,就连捡破烂都不会有人要的!

[ 本帖最后由 1jjk 于 2006-11-24 08:54 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2006-11-24 08:53 |只看该作者
原帖由 绿茶主演 于 2006-11-23 18:11 发表
int i;
   int j;
   i=0;
   j=(++i)+(++i)+(++i);
   }
   求j运行后的值!


不加()都能很无聊,还加()!简直太无聊了

论坛徽章:
0
24 [报告]
发表于 2006-11-24 09:17 |只看该作者
应该是9吧

论坛徽章:
0
25 [报告]
发表于 2006-11-24 09:28 |只看该作者
原帖由 1jjk 于 2006-11-24 08:49 发表
[code][liuqi@ljjk code]$ cat cc.s
        .file   "cc.c"
        .section        .rodata
.LC0:
        .string "%d,%d\n"
        .text
.globl main
        .type   main,@f ...


   subl    $4, %esp //调用函数返回操作,栈指针操作
这个操作的解释有点含糊。能不能详细解释一下?

论坛徽章:
0
26 [报告]
发表于 2006-11-24 09:44 |只看该作者
知道这个是未定义的行为就好了,没必要去给自己找麻烦

论坛徽章:
0
27 [报告]
发表于 2006-11-24 09:55 |只看该作者
茴香豆的茴字有几种写法?

论坛徽章:
0
28 [报告]
发表于 2006-11-24 09:58 |只看该作者
原帖由 MackedNice 于 2006-11-24 09:28 发表


   subl    $4, %esp //调用函数返回操作,栈指针操作
这个操作的解释有点含糊。能不能详细解释一下?


《深入理解计算机系统》
116页
图3。4
描述:压栈
效果:R(%esp)-4—》r(%ESP)

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-08 06:20:00
29 [报告]
发表于 2006-11-24 10:47 |只看该作者
这个主要是看用什么C了(与编译器有关)。用GCC, 它是从左到右。++优先级 高。 先算一个()。再算第二个(), 然后算二者之间的+号。 这样,答案是  7

如果用MS的studio 2005。它是先算 ++ (自加先算,优先级高), 把所有的 ++ (自加)算完, 再做 +,这样答案就是  9


如果原题中有 4项, 即增加一项 ++i 。 那么用GCC 就是 11。
用 MS V-studio 2005 就是  16 。

依次类推。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-08 06:20:00
30 [报告]
发表于 2006-11-24 10:52 |只看该作者

答案可是7, 也可能是9, 看用什么C了

这个主要是看用什么C了(与编译器有关)。用GCC, 它是从左到右。++优先级 高。 先算一个()。再算第二个(), 然后算二者之间的+号。 这样,答案是  7

如果用MS的studio 2005。它是先算 ++ (自加先算,优先级高), 把所有的 ++ (自加)算完, 再做 +,这样答案就是  9


如果原题中有 4项, 即增加一项 ++i 。 那么用GCC 就是 11。
用 MS V-studio 2005 就是  16 。

依次类推。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP