1、#define声明一个函数,表明一年有多少秒(忽略闰年)
#define SECONDS_PER_YEAR (60*60*24*365)UL
考察主要有几点:
a、语法知识,不能有分号,括号使用
b、预处理将计算常数表达式的值,写出如何计算比给出实际值更有意义
c、16位整数表达溢出,用到长整型L,考虑无符号UL会更好
写一个MIN宏,返回较小的一个
#define MIN(A,B) ((A<=B)?(A):(B)) 注意括号使用
2、const与#define有什么不同?
C+中都可以用来定义常量,但const比#define有更多优点
a、const常量有数据类型 ,而宏常量没有。编译器对const进行类型安全检查 ,而后者只是简单的字符替换(在字符替换中可能产生意料不到的错误--边际错误)
b、有些集成化的开发工具可能对const常量进行调试,但不能对宏常量进行调试。
3、const成员函数中,如何修改成员变量?
const成员函数中,用mutable 修饰成员变量名后,就可以修改类的成员变量了。
4、sizeof,内存对齐原则
struct {
char a ;
int b ;
short c ;
}A; sozeof(A)=12
struct {
short c ;
char a ;
int b ;
}B; sozeof(B)=8
char q1=”a\n” sizeof(q1)=3 \n为一字节
char* q2=”a\n” sizeof(q2)=4 为指针大小
http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html
为什么要进行内存对齐?
计算结构体变量大小时必须考虑数据对齐,虽然会浪费一些内存,但会使CPU的存储速度更快,效率更高
5、sizeof和strlen的区别
a、sizeof操作符结果是size_t (typedef unsigned int size_t)
b、sizeof是操作符 ,strlen是函数
c、sizeof可以用类型做参数,strlen只能用char*做参数,且必须以“\0”结尾
d、数组做sizeof参数不退化,做strlen参数退化为指针
e、大部分编译程序在编译时 就已经把sizeof计算出来了,strlen在运行时 计算出来(计算字符串长度而不是所占内存大小)
f、sizeof如果后接类型必须加括号,变量则不需要,因为它是操作符而非函数。
g、sizeof不能用于函数类型,不完全类型或位字段
6、内联函数和宏定义的区别?
内联函数和普通函数相比可以加快函数的运行速度,因为不需要中断调用。而宏只是一个简单的替换。
内联函数要做参数类型检查 ,这是内联函数相比宏的优势。inline是嵌入代码,把代码直接嵌入,和宏一样。inline和宏相比在不用付出额外代价的情况下更安全。宏是不加任何验证的直接替换 。
inline适用于以下情况:
一个函数被反复调用。
简单几行,不含forwhile switch等语句
inline必须与函数定义体放一起才能成为内联函数 ,如下:
inline void f(int x,int y); //inline与声明放一起,非内联
void f(int x,int y) {} 定义
//内联函数
void f(int x,int y);
inline void f(int x,inty){}