1、宏定义(详细文档)
题一题分析连接
ps: 关于题补充记忆:&array[5]表示array[5]的地址 - 索引
*&array[5]表示array[5] - 数值
概念要点一:宏只是文本替代,完完全全原样替代
eg:
#include /*宏定义在文件头和函数之间*/
#define S(a,b) a*b //需要注意的是S和()之间不能有空格
main()
{
int area;area=S(2+3,3+4);
printf("area=%d\n",area);
}
>>这里输出竟然是15,并不是我们想象中的35,怎么回事呢? 实际上S(2+3,3+4)传递过去后,它的红替换是 area=2+3*3+4,这下大家明白了吧。
题二分析连接
PS:主要是int最大值是32767,针对可能溢出添加UL,有别于官方答案这只作者运行答案:#define SEC_PER_YEAR (1UL*356*24*60*60)
题三:const与define的区别
const用于类成员变量定义,一旦定义且不能改变其值。
define定义全局常量,在任何地方都可以访问。
define不能在类中定义而const可以。
const不能在条件语句中定义常量
题四:修改类的成员变量怎么办(添加mutable)
题五:考察seizeof用法
要点一:基础字节数复习
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
要点二:直接看例子
char* ss1 = "0123456789"
cout<<sizeof(ss1)<<" "
输出为4(这里ss1就是字符指针,指针大小为定值4)
同样的对于这种情况
int *p = NULL;
printf ("sizeof(*p)= %d\n", sizeof(*p));//虽然p没有指向任何变量,但是定义的指向类型是int,
printf ("sizeof(p) = %d\n", sizeof(p));//这里则指向的是指针类型
int a[100];
printf("sizeof(a) = %d\n", sizeof(a)); //作为数组名a可以看成指针,但是这里代表整个数组的大小,分配100,每个占4,总共400
printf("sizeof(a[100]) = %d\n", sizeof(a[100]));//4
printf("sizeof(&a[0]) = %d\n", sizeof(&a[0]));//4
printf("sizeof(&a) = %d\n", sizeof(&a));//400
还有不要忽略“\0”
char ss[] = "0123456789"
这里的seizeof(ss)为11(10+1)
在看看结构体
struct{short1;short2;short3}A;
struct{long a1;short a2}B;
结构体默认对其为8字节,seizeof(A)结构体中三个short类型,每个short对应2字节,所以总字节为6,是2的整数倍
关键来了,seizeof(B)结构体中一个short类型和一个long(4字节),总字节为6,不是4的整数倍,所以这里补空字节到8,即seizeof(B)=8
题六:(内存中数据对其问题)先看两个例子
eg:
class A1{ char c;int a;char d;};
class B1{ char c;char d;int a};
这里sizeof(A1)返回12,sizeof(B1)返回8
形象说下就是这样,对于A1存储结构值
char~~~(4)
----int---(4)
char~~~(4)
对于B1存储结构是
charchar~~(4)
----int----(4)
eg:
class C1{ public; char c;int a;char d;};
class D1{ public; char c;char d;int a};
注:这里是静态变量,存放的是全局数据区,所以sizeof计算步骤为先计算类型的字节数,不足的通过里面的字类型取其倍数补齐,这里是总字节是6,最大字节是int4字节,所以补全为8
题七:sizeof和strlen的区别(参考)
最主要的是seizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的,拿上边的一个例子变形来说
char ss[100] = "0123456789"
这里的seizeof(ss)为100,对于strlen(ss)则为10,它内部实现是用循环计算字符串长度直到“\0”
题八:内联函数和宏定义的差别
宏操作的是 token, 可以进行 token的替换和连接等操作,在语法分析之前起作用。而函数是语言中的概念,会在语法树中创建对应的实体,内联只是函数的一个属性。
对于问题:有了函数要它们何用?答案是:一:函数并不能完全替代宏,有些宏可以在当前作用域生成一些变量,函数做不到。二:内联函数只是函数的一种,内联是给编译器的提示,告诉它最好把这个函数在被调用处展开,省掉一个函数调用的开销(压栈,跳转,返回)。
这段摘自知乎提问感觉比较通俗易懂
以上内容来自《程序员面试宝典》第六章习题和自己的搜索及理解,找实习找工作...陆续会刷一些题补一些知识,希望一起成长
网友评论