引言
本篇结合多段面试经历,在参考大量优质博客基础上,言简意赅地总结出如下C/C++高频面试点
目录
- C语言
- switch
- do{…}while(0)
- 枚举
- 结构体与共用体
- 全局变量与局部变量
- 数据类型
C语言
switch
switch语句允许测试变量与值列表的相等性,每个值称之为案例或者case,程序会检查switch后面的值并且与case后面的值比对,如果相等则执行后面的代码或代码块
- 当switch后面的变量值和case后面的常量值匹配相等后,case后面的代码将会被执行,直到break语句被执行后跳出switch代码块
- break不是必须的,如果没有break,则执行完当前case的代码块后会继续执行后面case代码块的内容,直到执行break才可以退出
- switch有一个默认的情况,我们用default关键词表示,当switch后面的变量和所有case后面的常量都不匹配的情况下,默认执行default后面的语句
注意:
- switch语句中使用的表达式必须具是int或enum类型,否则如float等其他数据类型是无法通过的编译的,因为编译器需要switch后面的语句和case后面的值精确匹配,而计算机无法精确表达一个float数据类型
- switch可以任意个case语句(包括没有), 值和语句之间使用:分隔
- case后面的值必须是int常量值,或者返回结果为int类型的表达式
do{…}while(0)
在实际开发过程中,循环更多采用for和while,而do{…}while()主要有以下作用:
#define是在预处理的时候进行直接替换,缺少相应的语法检查机制,如下:
#define LOG {print();send();};
void print()
{
cout<<"print: "<<endl;
}
void send()
{
cout <<"send: "<<endl;
}
int main(){
if (false)
LOG
cout <<"hello world"<<endl;
system("pause");
return 0;
if经过预处理替换会变成:
if (false)
{
print();
send();
};
else
{
cout <<"hello"<<endl;
}
因为if语句后面多加了个;而编译不通过 用do{…}while(0);可以包裹住要操作的#define,无论外面如何操作,都不会影响#define的操作:
#define LOG do{print();send();}while (0);
int main(){
if (false)
LOG
else
{
cout <<"hello"<<endl;
}
cout <<"hello world"<<endl;
system("pause");
return 0;
}
if则会变成:
if (false)
do{
print();
send();
}while (0);
else
{
cout <<"hello"<<endl;
}
cout <<"hello world"<<endl;
编译通过
枚举
枚举类型是C语言和C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合,所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内 注意:
- 第一个名称的值为 0
- 默认情况下,每个名称都会比它前面一个名称大 1
enum color1
{
red,
green,
blue
} c1;
c1 = blue;
enum color2
{
red,
green=5,
blue
};c2
c2 = blue;
结构体与共用体
定义:
- 结构体是C/ C++ 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项
- 共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型,可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值,共用体提供了一种使用相同的内存位置的有效方式
区别:
- 结构体占用的内存是所有的成员各自占用的内存空间之和
- 共用体占用的内存则不同,等于占用内存空间最大的那个成员
注:共用体是共用内存空间,所以每个成员都是读写同一个内存空间,那么内存空间里面的内容不停的被覆盖,而同一时刻,都只能操作一个成员变量
union Data{
int i;
float f;
char str[20];
};
int main( ){
union Data data;
data.i = 10;
data.f = 220.5;
strcpy( data.str, "C Programming");
printf( "data.i : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str);
return 0;
}
结果如下:
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
我们可以看到共用体的 i 和 f 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因
全局变量与局部变量
定义:
- 在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用
- 在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的
初始化:
- 定义局部变量时,系统不会对其初始化,必须自行对其初始化
- 定义全局变量时,系统会自动初始化为下列值
int — 0 char — ‘\0’ float — 0 double — 0 pointer — NULL
注意:局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值
数据类型
32位
类型 | 字节大小 |
---|
char | 1 | short | 2 | int | 4 | long | | float | 4 | long long | 8 | double | 8 |
指针类型:均为4字节
64位
类型 | 字节大小 |
---|
char | 1 | short | 2 | int | 4 | long | 4 | float | 4 | long long | 8 | double | 8 |
指针类型:均为8字节
类型转换
int sum = 7;
double mean = sum / 5;
int sum = 17;
double mean = (double) sum/5;
数组指针与指针数组
|