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

内容概要:本文介绍了一个关于三相桥式全控整流及有源逆变电路的实验仿真模型,重点研究三相整流器与逆变器在Simulink环境下的建模与仿真技术。内容涵盖电力电子变换器的工作原理、控制策略设计、系统动态响应分析,并进一步扩展至10kV配电网中不同中性点接地方式(中性点不接地、经小电阻接地、经消弧线圈接地)下的单相、两相短路接地及相间短路故障的仿真研究,全面呈现了电力系统典型故障的暂态特性。此外,文档还整合了丰富的科研资源,涵盖电力系统优化、新能源并网、故障诊断、微电网调度等多个前沿方向,充分体现了Matlab/Simulink在电气工程仿真中的核心地位广泛应用价值。; 适合人群:电气工程、自动化、电力电子等相关专业的高校学生、科研人员及工程技术人员,具备一定的电路理论基础仿真软件操作经验者更佳。; 使用场景及目标:①用于教学实验中帮助理解三相整流与逆变电路的工作机制;②支撑科研项目中对电力系统故障特性的建模与分析;③作为开发新型控制算法(如PWM控制、低电压穿越等)的仿真验证平台;④辅助完成毕业设计、课题研究或工程方案评估; 阅读建议:此资源以Simulink仿真实现为核心,强调理论与实践结合,建议读者在学习过程中同步搭建模型,动手调试参数,深入理解各模块功能与系统整体行为,同时可参考文中提供的完整资源链接拓展研究视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值