欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C/C++面试总结

程序员文章站 2022-03-07 22:49:13
...

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个字节
(3char         1Byte
    int           4Byte
    unsigned int  4Byte
    short int     2Byte
    long  int     4Byte
    float         4Byte
    double        8Byte
    string        4Byte4)数组长度
    *指定了数组长度:不看元素个数,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 111111112)十六进制的0xffffffff用有符号数来表示即用0xffffffff-232次方 = -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成员变量。