Linux 嵌入式 C 学习 Day3|变量、类型转换、全量运算符、IO 输入输出完整笔记

📅 2026/7/23 6:38:45 👁️ 阅读次数 📝 编程学习
Linux 嵌入式 C 学习 Day3|变量、类型转换、全量运算符、IO 输入输出完整笔记

前言

前两日吃透 Linux 操作、gcc 四步编译、C 语言基础数据类型,今天 Day3 深入程序核心:变量规范、初始化、隐式/强制类型转换、全套运算符、printf/scanf/getchar/putchar 输入输出,覆盖嵌入式 C 最常用的运算与交互逻辑,配套课堂练习题拆解,新手一次性吃透。

一、变量完整知识点

1. 变量底层原理

  1. 程序运行时,变量在内存中开辟一块对应数据类型大小的存储空间;
  2. 变量名是内存空间别名,通过变量名读写内存里的数据;
  3. 程序结束,变量内存自动回收。

2. 变量使用铁律

先定义,后使用;未初始化的变量内存是随机垃圾值,严禁直接使用。

3. 变量命名规范(嵌入式开发标准)

允许字符、数字、下划线,三大限制:

  1. 不能以数字开头;
  2. 不能和 C 语言关键字重名;
  3. 尽量不与库函数(printf、main 等)重名。

两种行业命名风格:

  1. Linux/GNU 风格(内核、嵌入式常用):下划线分隔temp_valmax_num
  2. 驼峰命名(上层应用)TempValMaxScore

核心原则:见名知意,可读性优先。

4. 变量定义与初始化

  1. 定义:数据类型 变量名;
intnum;floatf;charch;bool flag;// 需要引入头文件 #include <stdbool.h>
  1. 初始化:定义时直接赋值
inta=10;floatb=3.14f;
  1. 赋值:定义完成后修改值
inta;a=100;

二、表达式与数据类型转换

1. 表达式特性

由常量、变量、运算符组合而成;任何表达式必有值、必有对应类型。

2. 混合运算自动转换(隐式转换)

运算时两边类型不一致,低精度自动转为高精度统一计算,转换优先级从低到高:

char/short → int → unsigned int → long → float → double

特殊规则:

  1. char、short 参与运算,强制提升为 int;
  2. float 参与运算,强制提升为 double;
  3. 浮点精度永远高于整型;无符号高于有符号。

3. 强制类型转换(显式转换)

语法:(目标类型)变量/表达式

inta=10;floatb=(float)a;// int转float

风险:高精度转低精度会丢失数据(小数截断、高位直接截取)。

4. 赋值转换规则

  1. 整型赋值浮点:自动补小数,精度扩展;
  2. 浮点赋值整型:直接舍弃小数部分;
  3. 有符号/无符号互相赋值:直接拷贝内存二进制,正负可能翻转;
  4. 大数据存入小空间:截断低位,极易出现数值异常。

示例坑点:

charch=355;// char仅1字节,截取355二进制低8位,输出为负数printf("ch = %d\n",ch);

三、全套运算符详解

1. 算数运算符+ - * / % ++ --

  1. /:整型相除直接舍去小数,仅保留整数;浮点除法保留小数;
  2. %取余:只能用于整型,float/double 不能取余;
  3. 自增自减区分:
    • i++:后置,先使用原值,运算结束后自增 1;
    • ++i:前置,先自增 1,再使用新值;
  4. ++--仅能作用于变量,不能写(a+b)++

课堂练习题:数字拆分求和

定义int num=2389,取出千、百、十、个位并求和打印。

2. 赋值运算符

基础:=;复合赋值:+= -= *= /= %=

  • 左值:只能是变量(能放在等号左边,可修改内存);常量、表达式不能做左值;
  • 右值:常量、变量、表达式均可。

3. 逗号运算符

语法:表达式1,表达式2,表达式3...

执行顺序:从左至右依次运算,整体结果为最后一个表达式的值。

intres=(1+2,3+4,5+6);// res最终等于11

4. sizeof 运算符

作用:获取变量/类型占用内存字节数,编译阶段计算,不运行代码。

sizeof(int);floatf;sizeof(f);

打印专用格式符:%zu

5. 运算符优先级(速记)

括号 > 单目运算符 > 双目 > 三目 > 赋值 > 逗号

双目内部优先级:算数 > 移位 > 关系 > 位运算 > 逻辑

四、输入输出函数(stdio.h 必备)

1. 单字符 IO:putchar / getchar

putchar

  1. 功能:终端输出单个字符;
  2. 参数:ASCII 数值/字符常量;
  3. 返回值:打印字符的 ASCII 码(int 类型);
  4. 限制:一次只能输出一个字符。
putchar('A');putchar(65);

getchar

  1. 功能:从键盘读取一个字符;
  2. 典型练习:输入小写字母,转大写输出

原理:小写 a-z 比大写 A-Z ASCII 大 32,ch-32即可转换。

2. 格式化:printf / scanf

  1. printf:格式化打印,%d %f %c %s %zu等格式符;
  2. scanf:键盘读取数据,变量前必须加&取地址;

区分重点:

  • printf%f兼容 float、double;
  • scanf严格区分:float 用%f,double 用%lf

3. 字符串:puts、gets

  • puts:输出字符串,自带换行;
  • gets:读取整行字符串(实际开发存在安全漏洞,仅课堂演示)。

五、今日重点作业拆解

题目:定义a=37b=64,拼接出新数字3476

规则

  1. 千位:a 的十位
  2. 百位:b 的个位
  3. 十位:a 的个位
  4. 个位:b 的十位

分步计算

  1. a=37
    个位:37%10 = 7
    十位:37/10 = 3
  2. b=64
    个位:64%10 = 4
    十位:64/10 = 6
  3. 组合:3*1000 + 4*100 + 7*10 + 6 = 3476

完整代码示例

#include<stdio.h>intmain(void){inta=37,b=64;inta_shi=a/10;inta_ge=a%10;intb_shi=b/10;intb_ge=b%10;intnew_num=a_shi*1000+b_ge*100+a_ge*10+b_shi;printf("拼接结果:%d\n",new_num);return0;}

六、今日学习总结

  1. 变量必须初始化,命名遵循嵌入式规范,先定义后使用;
  2. 混合运算自动类型转换,高精度存低精度数据会丢失;
  3. 自增、取余、逗号、sizeof 是笔试高频运算符,分清前后置 ++ 区别;
  4. putchar/getchar 轻量化单字符交互,嵌入式底层调试常用;
  5. 数字拆分依靠/整除、%取余,是必考题型。

后续学习预告

下一节学习关系运算符、逻辑运算符、if 分支判断语句,正式进入程序逻辑控制。

标签

#嵌入式学习 #C语言Day3 #C语言变量 #C语言运算符 #printf scanf #Linux C 开发