1. int x=2,y=3,z; x==(z=y);//x=2,x只是参与表达式布尔值的判断,不改变原值 x=(y&z);//x=3 z=4; x=(y|z);//x=7按位或
2.x=x+1,x+=1,x++//三个效率依次从低到高 x=x+1;//读右x的地址;对x+1;读左x的地址;赋值。 x+=1;//读x的地址;对x+1;赋值。 x++;//读x地址;x自增1
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()注册一个函数,代码如下:
void f(){ printf("after exit..."); } int main(){ atexit(fun); }
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. 定义一个宏,表示一年有多少秒。
#define SECOND_PER_YEAR (60*60*34*365)UL
其中UL表示unsigned long,因为该数可能使有些16位的整数(有的机器)越界。
10. 定义一个标准宏MIN。
#define MIN(A,B) ((A)<=(B)?(A):(B))
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)
#define BIT3(0x1<<3) int a; void clear-bit3(void){ a&=~BIT3; }
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