C语言长文整理,关键字和数据类型

张开发
2026/5/21 22:48:19 15 分钟阅读
C语言长文整理,关键字和数据类型
作为嵌入式开发的基础C语言是一切开发的基础。从语法上来说C语言并不复杂 但编写优质可靠的嵌入式C程序并非易事不仅需要熟知硬件特性和缺陷还需要对编译原理和计算机技术知识有着一定的了解。在这么多年的嵌入式开发中我也积累了一些这方面的经验和思考这里总结下来系统地阐述嵌入式C语言的重要知识点。本系列以嵌入式软件开发实践为基础结合相关资料阐述嵌入式需要了解的C语言知识和重点这里首先从关键字进行说明。C语言关键字和运算符对于C语言的关键字主要内容如下所示。当然除了这些关键字以外作为嵌入式C语言还支持一些算术运算符、关系运算符、逻辑运算符、赋值运算符、位运算符等。对于上述运算符C语言支持运算符优先级这也是C语言中复杂且容易出错的部分。这套规则实际上十分复杂即使资深开发者也容易出错。可以大致去了解下但不建议在代码中运用这套优先级规则而是对于所有有疑问的地方使用括号或拆分语句来明确优先级反而是更优选择。具体示例说明如下。int a 35; int b 30; int c 20; // 优先级高于||如果理解为先执行||则结果就会出错 if (b c || a b a c) { printf(in region\n); } else { printf(out region\n); } // 使用括号来明确优先级 // 逻辑运算符 if ((b c) || ((a b) (a c))) { printf(in region\n); } else { printf(out region\n); } // 复合语句, a先赋值给b再执行 a 35; b a; // 复合语句, a先执行再赋值给c a 35; c a; printf(a %d, b %d, c %d\n, a, b, c); a 35; b a; a; a 35; a; c a; printf(a %d, b %d, c %d\n, a, b, c);可以看到优先级执行顺序可能会改变代码的执行结果。当然对于gcc编译工具对于不确定优先级的情况会给出警告但不能保证所有情况下都能告知而且还有很多开发者并不关注警告最终出现不可预测的结果。注意对于顺序不确定的地方不要想着节省代码量使用括号来明确优先级就是最优选择一定要注意。此外C语言也支持宏定义和预处理、平台扩展关键字(__attribute__等)、标准库函数如printf、scanf、strcpy、strcat、memset、memcpy等这些都是在嵌入式开发中常用的知识技能在本系列中都将进行详细说明。作为起始本节中将从数据类型和格式化输出开始说明。数据类型和格式化输出对于C语言来说支持的数据类型详细如下所示。数据类型描述char1字节8位用于存储字符数据。double8字节64位用于存储双精度浮点数数据。float4字节32位用于存储单精度浮点数数据。int至少2字节目前主流平台基本都是4字节用于存储整数数据。long/long int规定不低于int类型的长度目前主流平台基本都是4字节用于存储长整数数据。long long/long long int至少8字节目前主流平台基本都是8字节用于存储长整数数据。short/short int定义不超过int类型的长度目前主流平台基本都是2字节用于存储短整数数据。signed默认是signed配合整型表示有符号类型支持负数unsigned配合整型表示无符号类型不支持负数void用于定义无返回值函数也可以用于声明无类型的指针。_Bool用于定义布尔类型C99新增_Complex用于定义复数类型C99新增_Imaginary用于定义虚数类型只包含虚部(建议直接使用_Complex)C99新增可以看到C语言为了兼容从8位机到64位机的不同平台对于整型相关的数据类型并未限制长度某些16位平台int也可能为2字节。如果代码需要兼容不同的平台(一般是通用的库文件产品项目往往对这方面要求并不严格也很难直接兼容多个平台)往往不使用char、short、int、long long int这些整型类型而是使用typedef来定义。以STM32为例通过宏定义支持如下的类型。// 定义无符号整型 typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; typedef unsigned long long uint64_t; // 定义有符号整型 typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; typedef signed long long int64_t; // 使用示例 uint8_t a 10; uint16_t c 100; uint32_t d 1000; uint64_t e 10000; int32_t f -1000;另外C语言为了兼容不同的平台的sizeof函数也新增了size_t类型用于获取返回值的大小避免因为返回长度溢出而导致数值错误。// 获取int类型的大小 size_t len_1 sizeof(int); // 获取float类型的大小 size_t len_2 sizeof(float);C语言使用printf进行格式化输出常用的格式化输出符如下所示。格式化输出符描述示例%d输出有符号十进制整数printf(%d, 123);%ld输出长整数printf(%ld, 123);%u输出无符号十进制整数printf(%u, 123);%f输出单精度浮点数printf(%f, 3.14f);%e输出双精度浮点数科学计数法表示printf(%e, 6.02214076e23);%s输出字符串printf(%s, hello);%c输出字符printf(%c, a);%p

更多文章