C/C++面试总结
1.#include <> 与 #include “”的区别
前者先索引系统目录,如果没有,再索引当前目录,后者先索引当前目录,如果没有再索引系统目录
2.#ifndef、#define、#endif作用
防止重定义,即使文件被多次包含,也只定义一次
3.const与#define的区别
(1) 两者都可以定义常量,const用途更广
(2) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(3) 有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。
4.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
C++不同与C,C++支持函数重载,所以C++编译之后的符号名与C编译之后的函数符号名与不同,eg:void foo(int a,int b),此函数经C编译之后符号名可能为_foo,但是被C++编译之后符号名可能为_foo_int_int。这样的名字包含了函数名、函数参数数量及类型信息。
加extern “C”之后,解决了名字匹配问题,事项C/C++混合编程
5.sizeof
答:sizeof计算的是在栈中分配的内存的大小,是唯一在编译时计算的运算符,计算字符串时包括‘\0’
(1)sizeof不计算static变量占的内存
(2)不管什么类型的指针,大小一定是4个字节
(3)char 1Byte
int 4Byte
unsigned int 4Byte
short int 2Byte
long int 4Byte
float 4Byte
double 8Byte
string 4Byte
(4)数组长度
*指定了数组长度:不看元素个数,Byte = 数组长度*sizeof(元素类型)
*未指定数组长度:按实际元素个数确定长度
Ps:若是字符数组,应考虑末尾的空字符
(5)结构体对象长度
当结构体内元素长度小于处理器位数时,以结构体内最长数据元素的长度为对齐单位,即为其整数倍。
若结构体内数据长度大于处理器位数时,则以处理器位数为单位对齐。
(6)
6.c/c++中的*与&
int a = 10;
int *point = &a;
//其中*表示这是一个指针类型的变量,&表示取a变量的地址,point指针指向a变量的地址
*p = 5;//*p表示取变量的内容进行操作
7.c中的%md,%mf
其中的m表示输出宽度,若实际宽度小于m,则在左端补上空格之后输出。若实际宽度大于m,则按实际宽度输出
8.c语言中的unsigned char与char
//unsigned char 表示十进制0-255的数
//char 表示十进制-128~-1和0~127的数,16进制数值减去256,最高位为符号位,0表示正数,1表示负数
//物理上存储没有区别
// uchar char
//0x7f 127 127
//0x80 128 -128
//0x81 129 -127
注意:int型-1在内存中怎样存储
(1)首先-1是一个有符号数,1的二进制为00000000 00000000 00000000 00000001,-1则需要让最高位变为1,即10000000 00000000 00000000 00000001。
其次,负数在内存中存储时除最高位,其他位按位取反+1,即为11111111 11111111 11111111 11111111
(2)十六进制的0xffffffff用有符号数来表示即用0xffffffff-2的32次方 = -1
综上:-1在内存中以11111111 11111111 11111111 11111111的形式存在
9.循环体中的break,continue,return
break语句结束本层循环,continue语句结束本次循环,return语句结束函数
10.switch..case语句中,case后面必为常量
11.__cdecl
__cdecl是c\c++语言的默认调用方式,所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。
12.C语言中的单目运算符:!、~、++、–
13.C语言中的static作用
1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区);
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。注意,只有在定义了变量后才能使用。如果变量定义在使用之后,要用extern 声明。所以,一般全部变量都会在文件的最开始处定义;
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用;
以下是C++对static的扩展
4) 在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
5) 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。