C语言学习(第一天)
🔧 C语言基础与STM32矿探小车开发入门(第一篇)
🌟 前言
第一天接触STM32矿探小车项目,今日重点学习C语言基础语法,深入理解表达式与运算符的底层逻辑,为后续开发奠定基础。
环境安装:Dev-C++
📚 一、C语言基础语法详解
1.1 第一个C程序:Hello World
#include <stdio.h>
int main() {printf("hello world \n"); // '\n' 等价于换行符,与C++的std::endl功能相似return 0; // 标准返回值,建议显式添加
}
1.2 代码书写规范
- 格式要求:
- 代码顶格书写,括号成对出现,
{}
独立占行 - 括号内内容缩进一个Tab,多层嵌套时层级清晰
{ { { // 深层逻辑代码 } } }
- 代码顶格书写,括号成对出现,
1.3 变量定义与标识符规则
- 变量本质:存储数据的容器,值可变化
- 定义格式:
数据类型 变量名; // 如 int a; 数据类型 变量名 = 初始值; // 如 float b = 3.14;
- 标识符规则:
- 由
_
、字母、数字组成,禁止其他符号 - 数字不能开头(如
250sb
非法,sb250
合法) - 不能使用关键字(如
if
、for
、switch
等)
建议:见名知意,如temperature
比t
更易读
- 由
1.4 数据类型与内存占用
类型 | 字节数 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
int | 2/4字节 | -2^31 ~ 2^31-1 | 0 ~ 2^32-1 |
char | 1字节 | -128 ~ 127 | 0 ~ 255 |
float | 4字节 | 约±1.2e-38 ~ ±3.4e+38 | —— |
double | 8字节 | 约±2.3e-308 ~ ±1.7e+308 | —— |
- sizeof 运算符 :计算类型或变量占用字节数
printf("int占用 %ld 字节\n", sizeof(int)); // 输出:int占用 4 字节(32位系统)
1.5 常量类型与应用
- 整数常量:
- 八进制:以
0
开头,如0172
(对应二进制001 111 010
) - 十六进制:以
0x
开头,如0xff
(对应二进制1111 1111
)
- 八进制:以
- 字符常量:单引号包裹,如
'a'
(ASCII值97)、'\n'
(换行符)、'\0'
(字符串结束符) - 字符串常量:双引号包裹,自动末尾添加
'\0'
,如"abc"
占用4字节('a','b','c','\0'
)
⚙️ 二、表达式与运算符深度解析
2.1 表达式基础
- 定义:由运算符连接的合法式子,必有一个值
int a = 1 + 2 * 3; // 表达式1+2*3的值为7,a=7
2.2 核心运算符详解
2.2.1 算术运算符
- 整数运算特性:结果必为整数,如
3/2=1
,3%2=1
- 自增/自减运算符:
int i = 0; printf("%d %d", ++i, i++); // 输出:1 1(前置自增表达式值为1,后置自增表达式值为0)
2.2.2 关系运算符
- 结果类型:布尔值(0为假,1为真)
- 易错点:关系运算符从左到右结合
printf("%d", 5 > 4 > 3); // 输出0(先算5>4=1,再算1>3=0)
2.2.3 逻辑运算符(惰性运算)
运算符 | 规则 | 惰性示例 |
---|---|---|
&& | 全真为真,一假则假 | 0 && any (直接返回0,不计算any) |
` | ` | |
! | 取反(0变1,非0变0) | !5 (返回0) |
int a=0, b=1;
printf("%d %d", a++&&b++, a||!b); // 输出0 1(a++&&b++中a=0,不计算b++;a||!b中a=1,返回1)
2.2.4 位运算符(底层操作核心)
运算符 | 功能 | 示例(假设a=0b00000111,即7) |
---|---|---|
<< | 左移(乘2^n) | a<<1=0b00001110=14 |
>> | 右移(有符号补符号位,无符号补0) | a>>1=0b00000011=3 |
~ | 按位取反 | ~a=0b11111000=248 |
& | 按位与(置0操作) | a&~(1<<2)=0b00000011=3 (清第2位) |
` | ` | 按位或(置1操作) |
^ | 异或(取反/交换操作) | a^=1<<3 (第3位取反) |
经典应用:不借助临时变量交换值
int a=3, b=4;
a ^= b; b ^= a; a ^= b; // a=4, b=3
2.3 复合运算符与优先级
- 赋值复合运算:
a += b
等价于a = a + b
,同理支持-=
,*=
,/=
,%=
等 - 优先级口诀(从高到低):
() [] -> .
>! ~ ++ --
>* / %
>+ -
><< >>
>> < >= <=
>== !=
>&&
>||
>?:
>=
🛠️ 实战练习与代码优化
练习1:位操作实战
#include <stdio.h>
int main() {unsigned char a = 7; // 0b00000111// 置位操作:将第5、6位(从0开始)置1a |= (3 << 5); // 3<<5=0b1100000,按位或后第5、6位为1// 取反操作:高4位取反,低4位不变a ^= (0xF0 << 4); // 0xF0<<4=0xF000(高8位取反,此处仅影响高4位)printf("操作后a的值:%d(二进制:0b%08b)\n", a, a);return 0;
}
练习2:颜色值合成(32位ARGB)
#include <stdio.h>
int main() {unsigned char alpha = 255; // 透明度unsigned char red = 255; // 红色unsigned char green = 0; // 绿色unsigned char blue = 128; // 蓝色// 合成颜色值:alpha(8位) + red(8位) + green(8位) + blue(8位)unsigned int color = ((unsigned int)alpha << 24) |((unsigned int)red << 16) |((unsigned int)green << 8) |blue;printf("ARGB颜色值:0x%08X\n", color); // 输出:0xFFFFFF80return 0;
}
📌 结束语
本篇涵盖C语言基础语法与运算符核心知识,后续将逐步深入STM32开发。建议重点掌握:
- 数据类型与内存占用的底层逻辑
- 位运算符在嵌入式开发中的高频应用
- 表达式求值顺序与运算符优先级
🔥 订阅专栏持续学习:C语言到基于STM32的智能矿探小车
💬 欢迎点赞、收藏、留言讨论,一起攻克嵌入式开发!