面试---C/C++基础

1. 编译过程

预处理:预处理相当于根据预处理命令组装成新的C程序(头文件展开,宏定义替换等),不过常以.i为扩展名。

编译: 将得到的.i文件翻译成汇编代码.s文件。

汇编:将汇编文件翻译成机器指令,并打包成可重定位目标程序的.o文件,该文件是二进制文件,字节编码是机器指令。

链接:将引用的其他.o文件并入到我们程序所在的.o文件中,处理得到最终的可执行文件。

2. 宏定义和const

2.1 宏定义的使用

宏定义本身可以理解为字符的替换,在实际编程中有很多的应用,宏可以带参数,如:

  1. 宏定义给某个数bit3置位和清零
// An highlighted block
#define SET(a,b)  a|(0x1<<b);
#define CLR(a,b)  a&(~(0x1<<b));
  1. 宏定义一个求两个数最小值的函数
#define MIN(A,B) ((A)>(B))?B:A
  1. 宏定义求最大值函数,不能使用 >,<,if,语句
//宏定义参数需要用括号括起来,且表达式内部不能有空格
#define max(a,b)  (((a)-(b))&(1<<31))?(b):(a)
#define max(a,b)  (a-b)==abs(a-b)?a:b
#define max(a,b)  ((((long)((a)-(b)))&0x80000000)?(b):(a))
  1. 交换两个数的函数
#define swap(a,b) {a=a+b;b=a-b;a=a-b;}

2.2 const

常量定义必须初始化,对于局部对象,常量存放在栈区,对于全局对象,常量存放在全局/静态存储区。对于字面值常量,常量存放在常量存储区。
1. const的含义

const int a;  //整型常量
int const a;  //整型常量
const int *a; //指向整型常数的指针(指向的常数不可修改,指针本身可以修改)
int* const a; //指向整数的常指针(指针本身不可修改,指向的整数可以修改)
int const* a const; //指向常量的常指针(都不可修改)

2. 为什么使用const?
(1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的)。
(2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
(3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
3.const修饰成员函数的目的
const修饰成员函数表明该函数调用不会对对象作出任何更改,事实上,如果确认不会对对象作出修改就应该加上const限定,这样无论是const对象还是普通对象都可以调用该函数。

2.3 宏定义和const的区别(定义常量)

  1. 宏定义是在编译之前进行的,而const是在编译阶段处理的
  2. 宏定义不占用内存,而const定义的常量占用内存单元
  3. 宏定义没有具体的数据类型,而const有具体的数据类型
  4. 宏定义可以带参数进行定义,而const不能带参数定义

3. sizeof和strlen,char * 和 char[]的区别

  1. sizeof是运算符,strlen是函数
  2. strlen只能用char*做参数,且必须以"\0"结尾,sizeof可以用类型或函数做参数
  3. 数组做sizeof的参数不退化,做strlen的参数时退化为指针
  4. sizeof在编译时确定类型占内存的大小(大部分编译器),因此sizeof(x)可以用来定义数组维数,可以通过以下方式确定数组长度
int num[10] = {
    0,1,2,3,4,5,6,7,8,9 };
int len1 = sizeof(num); //len1 = 40
int len2 = sizeof(num) / sizeof(num[0]); //len2 = 10
  1. strlen在运行时计算字符串的长度
char str[20] = "0123456789";//存放在堆栈区,可以修改
char *p_str = "0123456789"; //存放在常量区,不可修改
char *p = str;
int len3 = strlen(str); //len3 = 10;
int len4 = sizeof(str); //len4 = 20;
int len5 = sizeof(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值