C面试题——读程序题——汇总

未完,更新中.。。

都是个人的一些解读,不对请指出


        int foo(int x,int n){
        int val = 1;
        if(n > 0){
                if(n%2 == 1)
                        val *= x;
        val *= foo(x*x,n/2);
        }
        return val;
}
问描述了x和n的什么关系?

A. x^n B.n^x C.x*n D.不确定

应该是A,x的n次幂,至于过程:

递归操作,幂数n不停的减半,每次减半就把x的平方传进去下一次递归,比如5,25,625这样传参。if语句是防止n / 2 丢位,进行的补全,补的是每次递归相应的x,不一定是初始的5。






#include<stdio.h>
int main(void){
        int i = 3;
        int j;
        j = sizeof(++i + ++i);
        printf("i = %d,j = %d\n",i,j);
//        i = 3;j = 0;
//        printf("test:i:%d\n",i);
//        printf("test:%d\n",(++i + ++i));
        return 0;
}
问输出结果:

应试教育的悲哀?又是出题解题技巧:虚晃一枪——你以为要判断自增运算符的理解,其实根本就不在那~!

答案应该是4,因为sizeof针对的是类型,无论32位的 i 和 i 怎么相加,也不能变成64位的 double 型,因为(++i + ++i)返回的是(int类型)地址,所以只能当作sizeof(int) 看,在一般32位机肯定结果是4了。

至于注释部分,是想告诉你,如果是判断自增运算符,应该是这种用法,至于优先级怎么算?不要绞尽脑汁去意淫C语言的规则了,和编译器有关系吧,如果没关系更好,我说这种情况就是通用了~!想说至少在linux gcc中编译都是这种模式:前自增都在整个语句的前边完成,后自增都在整个语句的后边完成,没有“等号”赋值操作符左边右边一说,BTW:我用的GCC直接取消了赋值操作符左边有自增操作符的可能,无论a++还是++a,都不被认为是“左值”~!所以这个过程就是:i 从3变成4,再变成5,最后5+5等于10。

过程如下:

(gdb) display /i $pc
1: x/i $pc
=> 0x804843f <main+91>:	addl   $0x1,0x18(%esp)
(gdb) si
0x08048444	9		j = ++i + ++i;	
1: x/i $pc
=> 0x8048444 <main+96>:	addl   $0x1,0x18(%esp)
(gdb) si
0x08048449	9		j = ++i + ++i;	
1: x/i $pc
=> 0x8048449 <main+101>:	mov    0x18(%esp),%eax
(gdb) si
0x0804844d	9		j = ++i + ++i;	
1: x/i $pc
=> 0x804844d <main+105>:	add    %eax,%eax
(gdb) si
0x0804844f	9		j = ++i + ++i;	
1: x/i $pc
=> 0x804844f <main+107>:	mov    %eax,0x1c(%esp)


这个太简单,没什么说的:

#include<stdio.h>
struct s{
        int a;
        int b;
        int c;
}
main(){
        struct s val = {3,4,5};
        struct s *tmp = &val;
        printf("%d",*(int*)tmp);

}
一个强制转换,刚好尺寸(size)都一样大(int型),就取第一个值了。













========================================================================================================================================================================================================================================================================

PS:gdb加载可执行文件,之前都是记得gcc 需要-g选项,现在不加的话又仔细阅读了一下提示:

(gdb) file a.out
Reading symbols from /usr/local/C-language/Interview/a.out...(no debugging symbols found)...done.
可能-g就是加入了一个debug的符号表什么的,不是很清楚,以后有兴趣查。






















  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值