【C语言深度解剖】预定义章节经典面试题讲解(offsetof宏模拟实现)【超详细的解释和注释】
【C语言深度解剖】预定义章节经典面试题讲解(offsetof宏模拟实现)【超详细的解释和注释】
那么这里博主先安利一下一些干货满满的专栏啦!
作者: #西城s
这是我的主页:#西城s
在食用这篇博客之前,博主在这里介绍一下其它高质量的编程学习栏目:
数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!
今天博主将带大家做一些预定义章节的面试题,带大家熟悉和深度掌握预定义章节
本篇位不收藏必后悔系列篇~
前言
关于预定义内容的两篇详细介绍,同样是干货满满的文章,不要错过噢~
【C语言深度解剖】一篇解决程序的环境【编译+链接详解】让面试官给我们竖起大拇指
【预定义】C语言预定义代码(宏、条件编译等)内容介绍【最全的保姆级别教程】
题目1
- 设有以下宏定义:
#define N 4
#define Y(n) ((N+2)*n)
(这种定义在编程规范中是严格禁止的)则执行语句:z = 2 * (N + Y(5 + 1));
后,z的值为____
这题考察的其实是对宏在预处理阶段的替换方式的理解:宏在预处理阶段,是进行原封不动的替换的。
如果对这方面内容有疑问的伙伴们,可以通过博主的传送门食用上面两篇文章,这里面有非常非常详细的讲解:
所以这里宏的调用进行原封不动的替换后的结果为:
2*(4+((4+2)*5+1)
#define N 4
#define Y(n) ((N+2)*n)
int main() {
int z = 2 * (N + Y(5 + 1));
//2*(4+((4+2)*5+1)
//70
printf("%d\n", z);
return 0;
}
实现宏-交换一个数二进制位中奇数位和偶数位
思考:
我们要交换奇数位和偶数位,首先我们先要将某个数的奇数位和偶数位提取出来吧
- 首先,我们发现,一个数字比如15:
00000000000000000000000000001111
如果按位与上一个01010101...0101
这样一个数字,就可以将数字二进制中的奇数位提取出来。 - 同理,我们发现,一个数字按位与上一个
1010....1010
这样一个数字之后,我们就可以将它的偶数位提取出来 01010101...01
这个数字表示成16进制就是0x55555555
,同理,101010...1010
这个数字表示成16进制就是0xaaaaaaaa
- 当我们分别按位与完之后,奇数位向左移一位,偶数位向右移一位,再相加,我们就能得到我们的结果了。
//写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
#if 1
#define __SWAP_BIT(num) num=((num&0x55555555)<<1)+((num&0xaaaaaaaa)>>1)
int main() {
int num = 10;
//00000000000000000000000000001111
//我们发现,我们只需要按位与一个01010101...01的数字,奇数位就留下了
//同样,如果将0101...01这个数字向左移动一位,就可以再按位与num就可以留下偶数位了
//01010101010101010101010101010101
//0x55555555
__SWAP_BIT(num);
printf("%d\n", num);
return 0;
}
#endif
offsetof
宏的模拟实现
offsetof宏的使用
作用:计算结构体中某变量相对于首地址的偏移
所要包含的头文件:#include<stddef.h>
图片来自www.cplusplus.com
使用举例:
这里的输出结果涉及到结构体内存对齐方面的内容,伙伴们可以自行了解一下先,后面博主会专门出一期博客讲解这方面的内容。
#include<stddef.h>
struct S {
int a;
char c;
double d;
};
int main() {
printf("%d\n", offsetof(struct S, a));//0
printf("%d\n", offsetof(struct S, c));//4
printf("%d\n", offsetof(struct S, d));//8
return 0;
}
模拟实现:
实现:#define __OFFSETOF(st_type,mem_name) (size_t)&(((st_type*)0)->mem_name)
#include<stddef.h>
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
//考察:offsetof宏的实现
struct S {
int a;
char c;
double d;
};
#define __OFFSETOF(st_type,mem_name) (size_t)&(((st_type*)0)->mem_name)
int main() {
printf("%d\n", __OFFSETOF(struct S, a));
printf("%d\n", __OFFSETOF(struct S, c));
printf("%d\n", __OFFSETOF(struct S, d));
return 0;
}
尾声
到这里就是本期博客的全部内容了,当然,关于这方面的具体内容知识点,可以通过博主通过的传送门进行详细了解噢~
【C语言深度解剖】一篇解决程序的环境【编译+链接详解】让面试官给我们竖起大拇指
【预定义】C语言预定义代码(宏、条件编译等)内容介绍【最全的保姆级别教程】
如果你感觉这篇博客对你有帮助的话,不要忘了一键三连:点赞收藏关注噢~
【C语言深度解剖】预定义章节经典面试题讲解(offsetof宏模拟实现)【超详细的解释和注释】的更多相关文章
- C语言深度解剖读书笔记(6.函数的核心)
对于本节的函数内容其实就没什么难点了,但是对于函数这节又涉及到了顺序点的问题,我觉得可以还是忽略吧. 本节知识点: 1.函数中的顺序点:f(k,k++); 这样的问题大多跟编译器有关,不要去刻意追求 ...
- C语言深度解剖读书笔记
开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...
- 【转】 C语言深度解剖读书笔记(1.关键字的秘密)
本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...
- 《C语言深度解剖》学习笔记之关键字
第一章 关键字 C语言共有32个关键字. 关键字 auto 声明自动变量 int 声明整型变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整 ...
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- c语言深度解剖(笔记)
1.1最宽恒大量的关键字----auto 函数内部变量,限制作用域为这个 1.2.1最快的关键字---- register函数. 关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中 1.2.2使 ...
- 《C语言深度解剖》学习笔记之函数
第6章 函数 1.编码风格 [规则6-1]每一个函数都必须有注释 [规则6-2]每个函数定义之后以及每个文件结束之后都要加若干个空行 [规则6-3]在一个函数体内,变量定义与函数语句之间要加空行 [规 ...
- 《C语言深度解剖》学习笔记之内存管理
第5章 内存管理 1.野指针 定义指针变量的同时最好初始化为NULL,用完指针后也将变量的值设置为NULL.也就是说除了使用时,别的时间都把它设置为NULL 2.堆,栈和静态区 堆:由malloc系列 ...
- 《C语言深度解剖》学习笔记之指针和数组
第4章 指针和数组 1. int *p=NULL 和 *p=NULL 有什么区别 int *p = NULL; 第一句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是 int类型的数据:在定 ...
- 《C语言深度解剖》学习笔记之预处理
第3章 预处理 1.下面两行代码都是错的.因为注释先于预处理指令被处理,当这两行被展开成“//……”和“/*……*/”时,注释已处理完毕,所以出现错误 #define BSC // #define B ...
随机推荐
- 十、docker镜像的分层
系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...
- win32com操作word API精讲 第八集 Range和Selection的区别
本课程<win32com操作word API精讲&项目实战>以视频为主,文字为辅,公众号ID:一灯编程 众所周知,在word编程中Range和Selection都能实现范围的选中, ...
- C#利用折线图分析产品销售走势
图形界面 数据 查询效果 代码 private void button1_Click(object sender, EventArgs e) { G++; DrowFont(this.comboBox ...
- Redis 哨兵模式高可用
本文为博主原创,未经允许不得转载: 目录: 1. 哨兵 Sentinel 介绍 2. 哨兵架构特点及工作原理 3. redis哨兵架构搭建步骤 4. 哨兵数据丢失 5. spring boot 整合 ...
- Android之AMS原理分析
在学习android框架原理过程中,ams的原理非常重要,无论是在面试中还是在自己开发类库过程中都会接触到. 1 简述 ActivityManagerService是Android最核心的服务,负责管 ...
- 【lvgl-micropython】官方源码之ports/unix 编译报错
lv_micropython/ports/unix make 报错 编译环境如下 这是缺少SDL2库导致的 sudo apt-get install libsdl2-2.0 sudo apt-get ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.2)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- 通过宿主机查看K8S或者是容器内的Java程序的简单方法
通过宿主机查看K8S或者是容器内的Java程序的简单方法 背景 最近一个项目的环境出现了 cannot create native process 的错误提示 出现这个错误提示时, docker ex ...
- [转帖]Linux内核参数 rp_filter
https://www.cnblogs.com/chenmh/p/6001977.html 简介 rp_filter (Reverse Path Filtering)参数定义了网卡对接收到的数据包进行 ...
- [转帖]一文说清 Linux System Load
https://zhuanlan.zhihu.com/p/447661302 双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如 ...