程序员面试宝典(第四版)——读书笔记-2、第六章:预处理、const与sizeof

6.1 宏定义


1、 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

         #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

解析:
1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 、写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
        #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 

这个测试是为下面的目的而设的:
1) 标识#define在宏中应用的基本知识。这是很重要的。因为在  嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3) 懂得在宏中小心地把参数用括号括起来


6.2 const


1、修饰一般变量

  1. const int i=2;  

  2. // the above same as  
  3. int const i=2;  

即,修饰符const可以用在类型说明符前,也可以用在类型说明符后。(习惯多用在类型说明符前,但建议用在类型说明符后)


2、修饰数组(同修饰变量)


3、修饰指针

  1. const int *p1;// p1可变,p1指向的对象不可变
  2.   
  3. int const *p2;// 同上  

  4. int ival=1;  

  5. intconst p3=&ival;// p3不可变且必须初始化,p3指向的对象可变 
  6.  
  7. const intconst p4=&ival;// 指针p4和p4指向的对象都不可变,且p4必须初始化  

记忆方法1 :const修饰符可以放在所修饰类型的前面或后面,建议放在后面。
记忆方法2 :先忽略类型名(编译器解析的时候也是忽略类型名),我们看const离哪个近,就是修饰它后面的那个类型。

    const int *p1;// const修饰*p1
    int const *p2;// 同上
    int ival=1;
    int * const p3=&ival;// const修饰p3
    const int * const p4=&ival;// 第一个const修饰*p4,第二个const修饰p4


4、 修饰函数的参数和函数的返回值

5、const与#define相比不同之处

C++中可以用const定义常量,也可以用#define定义常量,但是前者比后者有很多优点
const常量有数据类型,而宏常量没有数据类型;编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误。边际效应;有些集成化的调试工具可以对const常量进行调试,但不能对宏常量进行调试。


6、在const成员函数中,用mutable修饰成员变量名后,就可以修饰类的成员变量了。

mutable int m_Count;



6.3 sizeof


1、字符指针的大小是一个定值,就是4个字节;字符数组实际值再加上隐含的”\0“一个字节。


2、注意静态变量时存放在全局数据区的,而sizeof计算栈中分配的大小 不计算在内的。例如static int b不计算在内


3、说明sizeof和strlen之间的区别

sizeof是运算符,strlen是函数。

sizeof可以用类型作参数,strlen只能用char* 作参数,且必须是以“\0”结尾的。sizeof还可以用函数做参数。

数组做sizeof的参数不退化,传递给strlen就退化为指针。


4、sizeof的使用场合:

sizeof的主要用途是与存储分配和I/O系统那样的历程进行通信;

看看某种类型的对象在内存中所占的单元字节。

如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。



6.4 内联函数和宏定义


1、内联函数和宏定义的差别是什么?

内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接镶嵌到目标代码中。而宏只是一个简单的替换。

内联函数要做参数类型检查,这是内联函数跟宏相比的优势。

inline 是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小代码来说inline增加空间消耗换来的是效率提高,这方面和宏是一模一样的,但是inline在和宏相比没有付出任何额外代价的情况下更安全。至于是否需要inline函数,就需要根据实际情况来取舍。

inline一般只适用于如下情况:

一个函数不断被重复调用。

函数只有简单的几行,且函数内不存在while、for、switch语句。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值