当前位置: 首页 > news >正文

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语言来说,支持的数据类型详细如下所示。

数据类型

描述

char

1字节,8位,用于存储字符数据。

double

8字节,64位,用于存储双精度浮点数数据。

float

4字节,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

http://www.jsqmd.com/news/669262/

相关文章:

  • BluetoothKit核心组件解析:Central与Peripheral角色详解
  • 如何彻底解决八大网盘下载限速问题:网盘直链下载助手完整指南
  • Gradle构建缓存避坑指南:从Docker部署缓存节点到解决Android Studio代理冲突
  • JavaScript中Number构造函数对各种类型的转换规则
  • python devspace
  • Que迁移指南:从0.x到2.x的无缝升级策略
  • tabula-py错误处理大全:解决10个最常见的表格提取问题
  • 3步搞定自托管AI对话平台:从零到部署完整指南
  • 别再只改分压电阻了!深入拆解LLC电源(以CM6901为例)大范围调压的真正难点
  • Pixeval终极安全指南:全方位保护你的Pixiv使用体验
  • c++如何通过重定向rdbuf来捕获所有标准错误流到文件日志【详解】
  • 2026年3月垫路钢板出租厂商推荐,工地施工钢板出租/土方工程钢板租赁/防滑钢板/短期钢板租赁,垫路钢板出租公司选哪家 - 品牌推荐师
  • NelmioApiDocBundle集成指南:与JMS Serializer、FOSRestBundle完美协作
  • 如何在Sigma-Web-Dev-Course中集成TensorFlow.js构建浏览器端机器学习模型
  • 终极指南:如何为Quake III Arena添加流体模拟物理效果
  • May协程库与Tokio对比:栈式协程与Future异步模型的差异
  • 终极指南:UnleashedRecomp虚拟文件系统如何实现跨平台资源管理
  • OpenTelemetry Java入门指南:5分钟快速搭建分布式监控系统
  • python okteto
  • 终极Firefox优化指南:使用Betterfox提升隐私安全与浏览体验
  • 如何高效合并多个SQL表的字段_使用JOIN代替多次子查询
  • GitHub社区讨论通知声音终极自定义指南:打造个性化提醒体验
  • GoUtil fsutil包完全教程:文件系统操作的简单快速解决方案
  • FinMind基本面分析完全指南:财务报表、月营收数据的正确用法
  • 从一次抓包看懂TLS握手:Wireshark拆解Client Hello、Server Hello与密钥交换全过程
  • 终极smol安全编程指南:Rust异步环境下的内存安全和数据竞争预防
  • InstallWithOptions与工作配置文件:解决权限限制的完整方案
  • 终极指南:Mononoki编程字体特性详解 - 分数、上下标、连字功能实战教程
  • 如何优雅处理用户输入:Pagefind搜索输入处理的完整指南
  • 为什么你的AGI系统正在悄悄出卖用户?——基于NIST SP 800-218的隐私熵值审计法(附可落地检测脚本)