您的位置:首页 > 其它

6、预处理、const、sizeof

2015-08-08 22:26 232 查看
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){}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: