嵌入式学习Day3|C语言变量、类型转换、运算符、输入输出完整的复盘
嵌入式学习第三天,今天系统啃完C语言变量定义、数据类型转换、全套运算符、输入输出函数,都是写代码最基础、每天都会用到的基本功。
一、变量的定义规范
1.变量定义格式
数据类型 变量名;
- 数据类型:分为基本数据类型、构造数据类型,决定变量占用内存大小
- 变量名命名规则
1. 只能由字母、数字、下划线构成,不能以数字开头
2. 不能和C语言关键字重名(int、if、for这类不能做变量名)
3. 尽量不和库函数重名
4. 命名做到见名知意,推荐驼峰法、下划线命名(嵌入式Linux内核大量使用下划线命名)
2.各类变量定义写法
1.整型:short / unsigned short / int / unsigned int / long / unsigned long
2.浮点型:float(4字节)、double(8字节高精度)
3.字符型:char、unsigned char(串口、字符处理高频)
4.布尔类型:需要头文件 #include <stdbool.h> ,bool var;
3.变量初始化
1.初始化:定义变量的时候直接给初值
2.赋值:定义完成之后,再给变量写入数值
⚠️重点提醒:局部变量不初始化,里面是随机垃圾值!写代码一定要初始化变量,严禁直接使用未初始化变量
二、表达式与混合数据类型运算
1.表达式:运算符把常量、变量连接组成的式子,表达式一定有类型、一定有结果值
2.自动隐式类型转换规则(低精度→高精度)
转换优先级从小到大:
char、short → int → long → unsigned → float → double
- char、short运算时,会强制转为int计算
- float运算时,会强制提升为double运算
一句话:运算的时候,小类型自动向大类型看齐,避免计算丢失精度
3.强制类型转换(显式转换)
格式: (目标类型)变量/表达式
人为强制改变数据类型,使用时要注意精度丢失问题。
三、C语言全套运算符
1.算数运算符
+ - * / % ++ --
- %取余运算符:只能对整数使用,浮点不能取余
- 自增自减: i++ 先使用值,再+1; ++i 先+1,再使用值
课堂练习题:给定数字2389,取出千、百、十、个位数字求和,练习取余和除法运算。
2.赋值运算符
= += -= *= /= %=
- 左值:等号左边,只能放变量,常量、表达式不能放左边
- 右值:等号右边,变量、常量、表达式都可以
混合赋值的坑点:
1.整型赋值给浮点:自动扩展精度
2.浮点赋值给整型:直接舍弃小数点后面所有数据
3.大数据放进小空间:直接截断高位数据,数值会出错(char ch = 355就是典型截断例子)
3.逗号运算符
格式: (表达式1,表达式2,表达式3)
从左向右依次执行,最终结果取最后一个表达式的值
4.sizeof运算符
作用:计算数据类型/变量占用内存空间大小,单位是字节
sizeof(int); sizeof(a);
嵌入式超级重要!写驱动、数组、内存拷贝经常要用sizeof计算长度。
5.运算符优先级
优先级排序:括号 > 单目运算符 > 双目运算符 > 三目运算符 > 赋值 > 逗号
记不住优先级,直接多加小括号,代码可读性更高,不容易出错。
四、输入输出函数(stdio.h)
必须引入头文件 #include <stdio.h>
1.单字符IO函数
1. putchar() :输出单个字符到终端,只能输出1个字符
2. getchar() :从键盘读取单个字符,回车才结束输入
课堂练习:小写字母转大写,利用getchar接收,putchar打印输出
2.格式化IO
- printf():格式化打印,%d %c %f控制输出格式
- scanf():格式化键盘输入,注意变量前面必须带&取地址符号
3.字符串IO
gets()、puts():专门用来读取、输出一整行字符串
注意:gets函数存在缓冲区溢出风险,实际项目开发不推荐使用。
📝今日学习感悟
前两天熟悉Linux、gcc编译,今天正式深耕C语言基础语法!
我刚开始写代码出莫名其妙bug,根源就是:变量忘记初始化、类型转换截断数据、运算符优先级搞错。嵌入式底层开发对数据类型极其敏感,char、int、unsigned用错,寄存器读取直接出错。
基础语法看着简单,但是每一条规则都要亲手敲代码验证,多做课堂练习加深印象。明天继续C语言判断、循环语句。