C语言笔记
文章平均质量分 59
dadalaohua
这个作者很懒,什么都没留下…
展开
-
【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序
这代码的可读性非常差,罗列紧凑的位运算难以理解,使用了不寻常的写法,利用了位运算来表示字符的ASCII码,将字符串 “Hello, World!这代码在技术上是一个有趣的练习,可以展示对位运算和ASCII码的理解。这个程序表面上完全不知道在做什么,但实际上就是利用位运算和数组,将字符串 “Hello, World!” 压缩成了一系列整数,最后再打印出来。本文链接:https://blog.csdn.net/u012028275/article/details/137424102。现在看代码就清晰很多了。原创 2024-05-02 22:00:29 · 540 阅读 · 0 评论 -
【学习笔记】C 语言中的 lambda
今天,我了解到 gcc C 至少从 3.0.4 版本开始支持。我希望我早点知道。在最近的上,Paolo Carlini 做了的演讲。他提到的一个新功能是 C++ 对 lambda 函数的支持。我想,如果 g++ 有它们,将它们引入 gcc 应该不会太难。我问 Paolo,他说他听说过一个项目正在研究这个问题。酷。今天,我去寻找在 gcc 中从事 lambda 函数工作的人。我没有找到他们。。;太棒了。而且,它只使用 gcc 支持了十多年的功能。太棒了。翻译 2023-11-11 22:06:57 · 252 阅读 · 0 评论 -
【C语言笔记】【陷阱系列】 打印输出问题
陷阱系列内容。用于记录各式各样有陷阱的C语言情况☺。原创 2023-06-01 23:53:41 · 482 阅读 · 3 评论 -
【C语言笔记】【陷阱系列】 函数声明问题
陷阱系列内容。用于记录各式各样有陷阱的C语言情况☺。原创 2023-05-30 00:16:53 · 797 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 编译时检查是否2的幂
用于在编译时检查常量表达式是不是2的 n 次幂,如果常量表达式不是2的 n 次幂,则强制编译错误,编译器报错,反之如果常量表达式是2的 n 次幂,则编译正常。该宏定义来自linux kernel 3.10。原创 2023-03-30 22:58:37 · 338 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 编译时检查 2
用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错,反之如果条件为假,则编译正常。这个宏定义没有返回值,如果需要返回值可以使用该宏定义来自linux kernel 3.10。原创 2023-02-12 16:51:36 · 821 阅读 · 0 评论 -
【圣诞快乐】用 C 语言画出一棵带有装饰的简易圣诞树
2022年圣诞节到来了,给大家画一棵圣诞树,希望大家都能安全地度过这个困难的时刻,希望所有糟糕的都是经历,所有的美好都会在之后到来,希望明年的还能画下新的一棵圣诞树。原创 2022-12-25 17:12:48 · 1770 阅读 · 4 评论 -
【C语言笔记】【宏定义系列】 编译时检查
用于在编译时检查一个条件是否为真,如果条件为真则会编译失败,编译器报错,反之如果条件为假,则编译正常,且有返回值,返回 0。该宏定义来自linux kernel 3.10。原创 2022-10-24 00:24:36 · 1168 阅读 · 0 评论 -
【C语言笔记】【陷阱系列】 sizeof的使用
陷阱系列内容。用于记录各式各样有陷阱的C语言情况☺。sizeof操作符的结果类型是size_t,是一个无符号的整数。原创 2022-10-09 23:44:57 · 474 阅读 · 0 评论 -
【C语言笔记】【小技巧系列】 判断字节序
BYTE_ORDER宏定义BYTE_ORDER表示当前机器的字节序,BYTE_ORDER的值被定义为,BIG_ENDIAN或者PDP_ENDIAN的其中之一。其中宏定义表示Little-Endian小端,宏定义BIG_ENDIAN表示Big-Endian大端,宏定义PDP_ENDIAN表示PDP-Endian。使用BYTE_ORDER需要包含头文件。使用BYTE_ORDER}或者#endif}==#endif}==#endif}宏定义与BYTE_ORDER,或者。...原创 2022-08-01 23:47:14 · 1497 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 判断是否2的n次幂对齐
用于判断一个数是否是2的n次幂对齐。如果这个数是2的n次幂对齐,返回真,否则返回假。例如判断256是否是232^323(也就是8)对齐。该宏定义来自linuxkernel3.10。原创 2022-07-17 19:00:34 · 820 阅读 · 0 评论 -
【C语言笔记】【小技巧系列】 条件表达式省略中间的操作数
【C语言笔记】【小技巧系列】 条件表达式省略中间的操作数在平时阅读代码时,有时候会看到代码中将条件表达式(conditional expression)中间的操作数(operand)省略的情况,例如下面的linux内核代码/drivers/usb/storage/transport.c中的一段代码: /* wait for the completion of the URB */ timeleft = wait_for_completion_interruptible_timeout( &原创 2022-05-01 10:21:05 · 509 阅读 · 0 评论 -
【C语言笔记】【有点逗系列】 一个打印 Hello world 的程序
【C语言笔记】【有点逗系列】 一个打印 Hello, world! 的程序有点逗系列内容。用于记录各式各样有点逗甚至没有什么用的C语言用法☺。功能说明在网上看到了个表面很混乱实则没什么用的打印Hello, world!的程序。程序如下:#define _________ }#define ________ putchar#define _______ int main#define _(a) ________(a);#define ______ _______(){#define __原创 2022-04-26 23:22:48 · 1202 阅读 · 0 评论 -
【C语言笔记】【有点逗系列】 使用goto语句实现switch语句的功能
【C语言笔记】【有点逗系列】 使用goto语句实现switch语句的功能有点逗系列内容。用于记录各式各样有点逗甚至没有什么用的C语言用法☺。功能说明功能就是使用goto语句实现switch语句的功能。该功能基于GNU对C语言扩展功能:标签作为值(Labels as Values)。也就是对Labels as Values这个扩展功能的一种使用方式,实现的这个switch功能实际并没啥用。实现代码void goto_switch(unsigned int val) { static vo原创 2022-01-22 10:06:12 · 1197 阅读 · 0 评论 -
【C语言笔记】【陷阱系列】 注释陷阱
【C语言笔记】【陷阱系列】 注释陷阱陷阱系列内容。用于记录各式各样有陷阱的C语言情况☺。陷阱代码首先我们看下如下代码,这个代码的打印结果是什么?int test(void){ int a = 20, b = 2; return a //* //*/ b ;}int main(int argc, char* argv[]){ printf("%d\n", test()); return 0;}原创 2021-09-07 23:12:25 · 233 阅读 · 0 评论 -
【C语言笔记】【陷阱系列】 有符号变量与常数比较问题
【C语言笔记】【陷阱系列】 有符号变量与常数比较问题陷阱系列内容。用于记录各式各样有陷阱的C语言情况☺。陷阱代码首先我们看下如下代码,这个代码的打印结果是什么?int main(int argc, char* argv[]){ char value = 0x80; if(value == 0x80) printf("value == 0x80\n"); else printf("value != 0x80\n");原创 2021-09-06 22:12:25 · 960 阅读 · 0 评论 -
【C语言笔记】【有点逗系列】 使用printf实现的加法
【C语言笔记】【有点逗系列】 使用printf实现的加法有点逗系列内容。用于记录各式各样有点逗甚至没有什么用的C语言用法☺。功能说明用于计算两个整数相加之和,例如1和2相加等于3。该代码是在该网站看到的:Some unknown features or tricks in C language。实现代码int add(int x, int y){ if(x != 0 && y != 0) return printf("%*c%*c", x, '0', y原创 2021-09-05 12:06:55 · 895 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 绝对值
【C语言笔记】【宏定义系列】 绝对值 abs宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于计算数值的绝对值,支持有符号和无符号的long,int,short,char类型。例如25的绝对值是25,-26的绝对值是26。该宏定义存在于linux kernel 2.6.38 - 4.3.6中。实现代码#define abs(x) ({ \ long ret; \ if (sizeof(x) == sizeof(long)) { \ long原创 2021-08-09 22:18:10 · 4162 阅读 · 2 评论 -
【C语言笔记】【宏定义系列】 结构体成员的大小
【C语言笔记】【宏定义系列】 结构体成员的大小 FIELD_SIZEOF宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于获取结构体成员的大小,占多少个字节。例如结构体struct typestruct type { char test_char; short test_short;};其中成员test_char占一个字节,成员test_short占两个字节。该宏定义来自linux kernel 3.10。实现代码#define FIELD_SIZE原创 2021-08-02 23:16:15 · 1228 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 四舍五入除法
【C语言笔记】【宏定义系列】 四舍五入除法 DIV_ROUND_CLOSEST宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于除法运算,将正或负的被除数除以正的除数,得到的结果会四舍五入到最接近的整数。例如4÷10=04 \div 10 = 04÷10=0,5÷10=15 \div 10 = 15÷10=1,47÷5=947 \div 5 = 947÷5=9,47÷5=1047 \div 5 = 1047÷5=10。该宏定义来自linux kernel 3.10。实现代码原创 2021-08-01 10:25:42 · 2475 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 获取可变参数宏的参数数量
【C语言笔记】【宏定义系列】 获取可变参数宏的参数数量宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于获取可变参数宏实际传递了多少个参数。例如调用COUNT_ARGS(1, 2, 3),我们填入了3个参数,返回值就是3;COUNT_ARGS(1),我们填入了1个参数,返回值就是1。实现代码#define __COUNT_ARGS(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _n, X...) _n#defi原创 2021-07-25 10:23:43 · 3679 阅读 · 11 评论 -
【C语言笔记】【宏定义系列】 粘连参数
【C语言笔记】【宏定义系列】 粘连参数宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于将两个参数粘连到一起,变成一个参数。例如将test和code粘连到一起,变成testcode。实现代码#define __CONCAT(a, b) a ## b#define CONCATENATE(a, b) __CONCAT(a, b)宏定义中:a和b表示要粘连到一起的参数。示例程序void test1(void){ printf("test1\n");}vo原创 2021-07-21 21:46:30 · 868 阅读 · 6 评论 -
【C语言笔记】【宏定义系列】 函数的类型检查
【C语言笔记】【宏定义系列】 函数的类型检查宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于在编译时检测函数是否是某个类型或者是指向某个类型的指针。该宏定义来自linux kernel 5.8。实现代码#define typecheck_fn(type,function) \({ typeof(type) __tmp = function; \ (void)__tmp; \})宏定义中:type表示要用来对比的类型。function表示要用来对比的函数或者函数原创 2021-07-19 23:53:19 · 1463 阅读 · 8 评论 -
【C语言笔记】【宏定义系列】 变量的类型检查
【C语言笔记】【宏定义系列】 变量的类型检查宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于在编译时检测变量是否是某个特定的数据类型。该宏定义来自linux kernel 5.8。实现代码#define typecheck(type,x) \({ type __dummy; \ typeof(x) __dummy2; \ (void)(&__dummy == &__dummy2); \ 1; \})宏定义中:type表示要用来对比的数据类型。原创 2021-07-18 10:18:14 · 1859 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 返回数值的低32位
【C语言笔记】【宏定义系列】 返回数值的低32位宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于查询一个值的0-31位,也就是低32位。例如数值为0x12345678abcdef01,查询值的0-31位,返回的是0xabcdef01。该宏定义来自linux kernel 5.10。实现代码#define lower_32_bits(n) ((u32)((n) & 0xffffffff))宏定义中:n表示要查询的数值。示例程序示例程序用于查询64位数0x12原创 2021-07-15 23:05:20 · 1077 阅读 · 4 评论 -
【C语言笔记】【宏定义系列】 返回数值的高32位
【C语言笔记】【宏定义系列】 返回数值的高32位宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于查询一个值的32-63位,也就是高32位。例如数值为0x12345678abcdef01,查询值的32-63位,返回的是0x12345678。该宏定义来自linux kernel 5.10。实现代码#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))宏定义中:n表示要查询的数值。示例程序示例程序用原创 2021-07-12 21:52:32 · 1442 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 重复值
【C语言笔记】【宏定义系列】 重复值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于将一个unsigned char类型的数值,以多次重复的形式,返回一个unsigned long类型的数值。例如unsigned char类型的数值为0x5f,如果使用平台的unsigned long类型长度为32位,那么返回的unsigned long类型的数值为0x5f5f5f5f。该宏定义来自linux kernel 5.10。实现代码#define REPEAT_BYTE(x) (原创 2021-07-05 21:21:10 · 1024 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 向下舍入到指定数值的倍数
【C语言笔记】【宏定义系列】 向下舍入到指定数值的倍数宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于将一个数向下舍入到小于等于该数的指定数值的倍数。例如一个要向下舍入的数是78,指定的数值为10,那么最后得到的数就是10的倍数,78向下舍入就是70。例如一个要向下舍入的数是789,指定的数值为100,那么最后得到的数就是100的倍数,789向下舍入就是700。例如一个要向下舍入的数是789,指定的数值为20,那么最后得到的数就是20的倍数,789向下舍入就是780。该宏原创 2021-07-01 23:35:05 · 629 阅读 · 4 评论 -
【C语言笔记】【宏定义系列】 向上取整到指定数值的倍数
【C语言笔记】【宏定义系列】 向上取整到指定数值的倍数宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于将一个数向上取整到大于等于该数的指定数值的倍数。例如一个要向上取整的数是66,指定的数值为10,那么最后得到的数就是10的倍数,66向上取整就是70。例如一个要向上取整的数是1066,指定的数值为100,那么最后得到的数就是100的倍数,1066向上取整就是1100。例如一个要向上取整的数是1066,指定的数值为20,那么最后得到的数就是20的倍数,1066向上取整就是10原创 2021-06-29 22:49:36 · 2739 阅读 · 11 评论 -
【C语言笔记】【宏定义系列】 返回一个限定在给定范围内的值
【C语言笔记】【宏定义系列】 返回一个限定在给定范围内的值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于返回一个限定在给定范围内的值。例如给定范围10到20之间,如果当前值为15时,处于范围10到20之间,返回15;当前值为5时,不在范围10到20之间,小于10,所以返回10;当前值为25时,不在范围10到20之间,大于20,所以返回20。这个宏会进行严格的类型检查。该宏定义来自linux kernel 3.10。实现代码#define clamp(val, min,原创 2021-06-28 21:45:25 · 1271 阅读 · 2 评论 -
【C语言笔记】【宏定义系列】 返回两个数中不为0的最小值
【C语言笔记】【宏定义系列】 返回两个数中不为0的最小值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于返回两个数中不为0的最小值,除非两个数都为0。例如a=0a=0a=0,b=12b=12b=12,会返回得到12。该宏定义来自linux kernel 3.10。实现代码#define min_not_zero(x, y) ({ \ typeof(x) __x = (x); \ typeof(y) __y = (y); \ __x == 0 ? __y :原创 2021-06-23 21:05:54 · 1271 阅读 · 2 评论 -
【C语言笔记】【宏定义系列】 三个数中的最小值
【C语言笔记】【宏定义系列】 三个数中的最小值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于比较三个数中数值的最小值。例如x=35x=35x=35,y=68y=68y=68,z=54z=54z=54,会得到35。该宏定义来自linux kernel 3.10。实现代码#define min3(x, y, z) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ typeof(z) _min3 =原创 2021-06-22 22:38:55 · 2953 阅读 · 6 评论 -
【C语言笔记】【宏定义系列】 三个数中的最大值
【C语言笔记】【宏定义系列】 三个数中的最大值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于通过比较来得到三个数中数值的最大值。例如x=20x=20x=20,y=40y=40y=40,z=80z=80z=80,会得到80。该宏定义来自linux kernel 3.10。实现代码#define max3(x, y, z) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ typeof(z) _ma原创 2021-06-21 23:04:24 · 3330 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 两个数中的最大值
【C语言笔记】【宏定义系列】 两个数中的最大值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于通过比较来得到两个数中数值的最大值。例如x=60x=60x=60,y=36y=36y=36,会得到60。该宏定义来自linux kernel 3.10。实现代码#define max(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void) (&_max1 == &_m原创 2021-06-20 11:33:06 · 1489 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 两个数中的最小值
【C语言笔记】【宏定义系列】 两个数中的最小值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于得到两个数中数值的最小值。例如a=25a=25a=25,b=18b=18b=18,会返回得到18。该宏定义来自linux kernel 3.10。实现代码#define min(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2原创 2021-06-20 00:20:57 · 5074 阅读 · 4 评论 -
【C语言笔记】【宏定义系列】 交换两个数
【C语言笔记】【宏定义系列】 交换数值宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于交换两个数的数值。例如a=20a=20a=20,b=15b=15b=15,交换两个数的数值之后,变成a=15a=15a=15,b=20b=20b=20。该宏定义来自linux kernel 5.8。实现代码#define swap(a, b) \ do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)宏定义中:a原创 2021-06-19 12:18:08 · 2620 阅读 · 0 评论 -
【C语言笔记】【宏定义系列】 整数乘以分数
【C语言笔记】【宏定义系列】 整数乘以分数宏定义系列内容。用于记录各式各样有用或者没用的宏定义☺。宏定义说明用于将整数乘以分数。可以避免不必要的溢出或精度损失。 该宏定义来自linux kernel 5.8。实现代码#define mult_frac(x, numer, denom)( \{ \ typeof(x) quot = (x) / (denom); \ typeof(x) rem = (x) % (denom); \ (quot * (numer)) +原创 2021-06-19 11:46:19 · 2075 阅读 · 0 评论