1.数据类型、常量与变量
基础数据类型表
| 类型关键字 | 含义 | 通常字节 | 取值范围/说明 |
|---|---|---|---|
| int | 整型 | 4字节 | -21亿~21亿(通常) |
| short | 短整型 | 2字节 | -32768~32767 |
| long | 长整形 | 4字节或8字节 | 依据平台而定,用于大整数 |
| char | 字符型 | 1字节 | 有符号:-128~127,无符号:0~255,本质是ASCII码 |
| float | 单精度浮点型 | 4字节 | 精度为6~7位小数 |
| double | 双精度浮点型 | 8字节 | 精度为16~17位小数 |
| void | 无类型 | 无 | 用于指针或函数返回值 |
修饰符
signed/unsigned:有符号(可存负数)和无符号(只存正数)。const:常量,定义后不可修改。volatile:告诉编译器该变量可能被程序以外的因素修改(如硬件寄存器),每次使用都要重新读取。
变量定义与初始化
int age = 20; // 定义整型变量并初始化
float pi = 3.14159f; // 注意浮点数后加 f
char grade = 'A'; // 字符用单引号
const double PI = 3.14159; // 常量,不能被赋值
注意事项:
float精度不够时用<font style="color:rgb(6, 10, 38);">double</font>char存储的是 ASCII 值,'A' == 65a++先使用后自增,++a先自增后使用
实际代码进阶使用
在嵌入式中,通常使用<stdint.h>中的固定宽度类型以确保跨平台兼容性。
#include <stdint.h> // 包含标准整数类型头文件
uint8_t led_status; // 无符号8位整数 (0-255),常用于GPIO状态
int16_t temperature; // 有符号16位整数,常用于温度传感器读数
2.运算符与表达式
运算符是处理数据的工具。
运算符分类
• 算术运算符: +, -, *, /, %(取余)。
• 关系运算符: >, <, ==, !=。
• 逻辑运算符: &&(与), ||(或), !(非)。
• 位运算符(嵌入式重点): &(按位与), |(按位或), ^(异或), ~(取反), <<(左移), >>(右移)。
• 赋值运算符: =, +=, -=, *=, /=。
• 自增/自减: ++, --。
注意事项:
• 类型转换: int 和 float 运算时,int 会自动转为 float。强制类型转换使用 (type)value。
• 运算符优先级: 算术 > 关系 > 逻辑。不确定时请加括号 ()。
代码示例:
#include <stdio.h>
#define PI 3.14159
int main() {
int age = 20;
float height = 1.75f;
char grade = 'A';
const int MAX_SCORE = 100;
printf("Age: %d, Height: %.2f, Grade: %c\n", age, height, grade);
printf("PI: %f, Max Score: %d\n", PI, MAX_SCORE);
int a = 5;
printf("a++ = %d, ++a = %d\n", a++, ++a); // 注意顺序!
return 0;
}
3.输入输出与格式化
标准输入输出
• printf():格式化输出到屏幕。
• scanf():格式化输入。
格式控制符
| 控制符 | 说明 |
|---|---|
| %d | 十进制整数 |
| %u | 无符号十进制整数 |
| %f | 浮点数 |
| %c | 单个字符 |
| %s | 字符串 |
| %x | 十六进制整数(小写) |
| %p | 指针地址 |
注意事项:
scanf("%d", &var);必须传地址- 多变量输入空格分隔
getchar()读取单个字符(包括换行)scanf读字符串遇空格停止,可用fgets替代- 输入数字后按回车,残留
\n会影响下次getchar() - 解决:在
scanf后加getchar()吃掉换行符
#include <stdio.h>
int main() {
int num;
float price;
char name[20];
printf("请输入姓名:");
scanf("%s", name); // 字符串不需要 &
printf("请输入年龄和价格:");
scanf("%d %f", &num, &price);
printf("\n=== 信息汇总 ===\n");
printf("姓名:%s\n", name);
printf("年龄:%d\n", num);
printf("价格:%.2f\n", price);
return 0;
}
4.控制语句
控制程序的执行流程。
- 条件判断:
if,else if,else,switch-case - 循环结构:
for,while,do-while - 跳转语句:
break,continue,goto(慎用)
注意:
switch只支持整型/字符型case末尾通常需要break,否则会发生“穿透”(fall-through)for(初始化; 条件; 更新)最常用do-while至少执行一次break跳出当前循环或 switch,continue跳过本次迭代
#include <stdio.h>
int main() {
int score = 85;
// if-else
if (score >= 90) {
printf("优秀\n");
} else if (score >= 80) {
printf("良好\n");
} else {
printf("及格\n");
}
// switch
char grade = 'B';
switch (grade) {
case 'A': printf("90-100\n"); break;
case 'B': printf("80-89\n"); break;
default: printf("其他\n");
}
// for 循环
printf("1 到 5 的和:");
int sum = 0;
for (int i = 1; i <= 5; i++) {
sum += i;
}
printf("%d\n", sum);
// while 循环
int count = 3;
while (count > 0) {
printf("倒计时:%d\n", count--);
}
// do-while
int x = 0;
do {
printf("至少执行一次\n");
x++;
} while (x < 1);
return 0;
}
5.数组与字符串
数组
• 一组相同类型数据的集合。
• 通过下标访问,下标从 0 开始。
• 一维数组: int arr[5] = {1, 2, 3, 4, 5};
• 多维数组: int matrix[3][3];(二维数组,常用于矩阵运算)。
字符串
- 字符数组,并以
\0结尾。 - 字符串处理函数(
string.h):
strlen(str):获取字符串长度。
strcpy(dest, src):字符串复制。
strcmp(str1, str2):字符串比较。
strcat(dest, src):字符串连接。
#include <stdio.h>
#include <string.h>
int main() {
// 一维数组
int nums[5] = {1, 2, 3, 4, 5};
printf("数组元素:");
for (int i = 0; i < 5; i++) {
printf("%d ", nums[i]);
}
printf("\n");
// 二维数组
int matrix[2][3] = {{1,2,3}, {4,5,6}};
printf("二维数组:\n");
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
// 字符串
char str1[] = "Hello";
char str2[20];
strcpy(str2, str1); // 复制
strcat(str2, " World"); // 拼接
printf("拼接后:%s\n", str2);
printf("长度:%zu\n", strlen(str2)); // %zu 用于 size_t
// 比较字符串
if (strcmp(str1, "Hello") == 0) {
printf("str1 等于 \"Hello\"\n");
}
return 0;
}