程序员面试宝典知识总结

1.  

2. 

3. if('A'==a)比if(a=='A')好处在于可检查==误写为=时的错误。把循环重复计算内容放在循环外可提高效率。

4. 不用比较等语句,找出两个数中的大者:

(1)int max=((a+b)+abs(a-b))/2.此方法可能越界错误。

(2)看a-b之后的符号位:int c=a-b; c=unsigned(c)>>(sizeof(int)*8-1);//移动到只剩最后一位,为1则b大,为0则a大。

5. 如何在不用中间变量时,交换两个整数a,b?

(1)a=a+b;b=a-b;a=a-b;//可能会越界。

(2)a=a^b;b=a^b;a=a^b;//^为异或运算。原理为:a^b^a=a;a^b^b=b;

6. 如何判断一段程序由C编译还是C++编译器所编译?

C++编译时定义了_cplusplus;而C编译器编译时定义了_STDC_

7. 若想main()退出后,仍能执行某部分代码,可以用atexit()注册一个函数,代码如下:

 

8. 一个int型与一个unsigned int型运算时,自动转化为unsigned int,故:

unsigned int a=6; int b=-20; a+b=4294967328(一个超大的数),因为符号位为1.

C/C++的自动类型转换,类型提升的两个通用指导原则为:

(1)为防止精度损失,如必要,类型总是被提升为较宽的类型。

(2)所以小于整数的有序类型,在计算之前都提升为整形,如char,signed char, unsigned char和short int。

(3)同级别的运算时,有unsigned 与非unsigned参与时,提升为unsigned。

9. 定义一个宏,表示一年有多少秒。

 

其中UL表示unsigned long,因为该数可能使有些16位的整数(有的机器)越界。

10. 定义一个标准宏MIN。

 

11. 指针变量的长度固定为4字节。

12. 结构体内元素对齐:当结构体内元素长度都小于处理器字长时,以结构体内最长的元素长度为对齐单位,即结构体长度为该最长元素的整数倍;如结构体内存在长度大于处理器位数的元素,则按处理器位数为对齐单位。但结构体内类型相同的连续元素,将在连续空间内(如数组)。类对齐与结构体一样,不过若有虚函数则会长度再加4,一个虚函数表的指针。int,int,short,short排列时长度为12,int,short,int,short排列时为16.不同平台,对齐可能略有不同。

13. strlen的参数必须是char*,而且必须以'/0'结尾。strlen计算字符串的字节数,汉字为2字节,返回值不计'/0'的长度,比如char ss[100]="123",strlen(ss)结果为3,sizeof(ss)结果为100,而且sizeof会计算'/0'。差别有几点:

sizeof是运算符,strlen是函数;是否计算'/0';字符串长度VS空间长度;应用场合不同。

14. vc++中,sizeof(string)为16.

15. 在参数传递时,虽然传入的是数组名,但到了被调函数中,数组名退化为了指针!C/C++中不像Java中,并不能传递数组。

指针与引用

1.指针与引用的区别:

(1)非空区别:引用必须声明时给其赋值。

(2)可修改区别:引用一旦指定,不可指向其它变量。

(3)如果一定指向某个对象,且指定期间不会改变,则用引用,否则用指针。引用不存在内存释放问题,而且不能指向未命名的对象,除非作为函数的形参定义。

(4)引用可指向一个常量,意指别名,会生成一个临时对象实现它,但指针不可指向常量,引用加了const修饰即可。

2. 用非this方式改写含有this的成员函数,方法是:给该成员函数加一个X * const THIS指针,其中X是类名。调用时将对象本身作为参数之一传递。

3. 语句int max(int,int);放在函数中没有任何作用,也不会报错。

4. int (*(*F)(int,int))(int);//表示F是一个指向函数的指针,它指向的函数接受参数(int,int),返回一个指针,返回的这个指针是个函数指针,指向的函数接受参数(int),返回值为int。

5. int a[2];int *p=a;//a++不行,p++可以,虽然二者值相同,但数组名a是常量指针,不得进行运算。

6. vector对象的指针可自动析构,不需要调用delete操作。

位与嵌入式编程

1. 用const修饰类的成员变量有两种情况:

(1)如果不是static的const常量,放在构造函数初始化列表中初始化。

(2)如果是static的则在定义时初始化public static int a=20;

2. printf("%f",5)//会导致内存访问越界

printf("%d",5.01)//会输出一个大数

3. 清除一个数的第三位(即置0)

 

4. unsigned short a=0xABCD;将其高低字节互换。

unsigned short CD=(a<<8)&0xff00;

unsigned short AB=(a>>8)&0x00ff;

unsigned short newData=CD|AB;

5. static在C中可用的地方:(1)函数体内(2)函数体外但模块中如main中(3)全局变量修饰(4)修饰函数。

6. char s[]="123456789";

char d[]="123";

strcpy(d,s);

cout<<s<<","<<d;//结果为56789,123456789.

7. strcpy要求字符串数组最后一位必须为'/0',如6中所示的声明情况,系统会自动加上。但如果用户自己初始化数组,要特别注意。

8. printf()中参数计算顺序是从右往左,如printf("%d,%d",i++,i++);第一个输出的数字更大。

9. 一个unsigned char在与整型int的数运算时,也会类型转换。如:

unsigned char a=0xA5; unsigned char b=~a>>4;//b=245.(1)移位的优先级高,(2)a先转为int,运算结果为unsigned char再给b。

10. x&(x-1)运算会减少一个x在二进制情况下的1.

11. 闰年的定义:能被4整除但不能被400带队;能被400整除。

12. 定义一个宏FIND,求一个结构体struc里某个变量相对struc的偏移量(相对地址)

#define FIND(struc,e) (size_t)&(((struc*)0)->e);

解析:把0转换为struc*类型的地址,然后取元素e的地址。

13. char *str与char str[]的区别:

str[]是分配一个局部变量,放在栈区;

*str分配一个字符串常量,放在字符串常量区,不能改变其值。

14. 指针的自增与自减运算,都是以所指类型的字节数为1个单位,a[3]-a[1]==2是永真的。

15. windows栈因是地址向下增长的一块连续内存,大小固定。一般是1M或2M,同理,由于栈是向下增长的,故:

int a,b; int *p=&a; //p++指向的不是b而p--指向b。

16. 排序算法的性能表:

算法 时间 空间 是否稳定

冒泡 o(n^2) 1

选择 o(n^2) 1

插入 o(n^2) 1

快速 最坏o(n^2)平均o(nlgn) logn

归并 o(nlgn) n

基数 o((n+k)*d) k

希尔 o(nlgn)^2 1

堆排 o(nlgn) 1

17. int *p=NULL;p=p+15;//此时p=60

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值