嵌入式学习 day3:c语言基础
一、变量详解1. 变量的定义与初始化变量是程序运行时值可以改变的量必须先定义再使用。c数据类型 变量名; // 定义 数据类型 变量名 初值; // 初始化推荐变量名规则只能由字母、数字、下划线组成不能以数字开头不能与C语言关键字重名最好见名知意MaxScore、temp_valcint a 10; // 整型变量 float pi 3.14; // 浮点型变量 char ch A; // 字符型变量⚠️重要变量不初始化会得到随机值务必养成定义即初始化的习惯感悟刚开始我总觉得定义变量随便写个名字就行直到有一次忘了初始化打印出来一个莫名其妙的数才明白随机值不是0而是内存里残留的垃圾数据。从那以后我强迫自己定义变量时顺手赋个初值——哪怕暂时赋0也行至少心里有底。2. 变量的赋值cint num; num 100; // 赋值将100拷贝到num的内存空间感悟之前我一直不理解赋值和初始化到底有什么区别老师打了个比方——初始化好比搬新家时把家具摆好赋值则是住进去之后随时挪动家具。虽然结果都是往空间里放东西但第一次和之后每一次在编译器看来是不同的。二、表达式与类型转换1. 表达式由运算符连接常量或变量组成的式子一定有类型和值。2. 混合运算类型转换规则当运算符两端类型不一致时低精度自动转高精度textdouble ← float ← unsigned long ← long ← unsigned int ← int ← char/short转换方式隐式转换混合运算时自动发生强制转换(类型)表达式如(int)3.14⚠️ 浮点转整型会舍弃小数部分大数据转小空间会截断高位可能产生意料之外的结果。感悟第一次做char ch 355; printf(%d, ch);时我以为会报错结果输出了99。老师解释说355的二进制是0000000101100011char只占1个字节截取低8位得到01100011即99。那一刻我才真正理解——C语言不会替你操心数据放不放得下它只负责忠实地执行指令。这种自由既是优点也是风险。三、运算符1. 算术运算符运算符含义注意 - * /加减乘除/整数相除得整数%取余只能用于整数 --自增自减只能作用于变量自增示例cint a 5; int b a; // b5, a6先赋值后自增 int c a; // c7, a7先自增后赋值感悟a和a一开始总是记混直到我想了一个笨办法——看在变量的哪一边在左边就先自增再拿值在右边就先拿值再自增。虽然有点机械但做题时再也没错过。编程里很多细节靠死记硬背不如自己找个小口诀。2. 赋值运算符运算符示例等价a 10—a 3a a 3-a - 3a a - 33. sizeof运算符获取类型或变量占用的字节数cprintf(%lu\n, sizeof(int)); // 输出4 printf(%lu\n, sizeof(a)); // 输出变量a的字节数感悟sizeof让我第一次直观感受到类型占多大空间。之前学的short占2字节、int占4字节只是书上的一行字自己用sizeof打印出来后才真正有了体感。有时候知识点从知道到相信就差一次亲手验证。4. 逗号运算符从左到右依次执行整体结果为最后一个表达式的值cint result (a1, b2, c3); // result c35. 运算符优先级速记text括号 单目 双目 三目 赋值 逗号感悟优先级表靠背是背不完的我的经验是——不确定就加括号。反正括号优先级最高多写一对不吃亏少写一对调试半小时就亏大了。四、输入输出函数1. putchar —— 输出单个字符cputchar(A); // 输出 A putchar(65); // 输出 A65是A的ASCII码 putchar(\n); // 输出换行只能打印一个字符返回值是该字符的ASCII码值。感悟第一次知道计算机不认识字母只认识数字时还挺震撼的——我们敲键盘输入A机器看到的其实是65。putchar(65)能显示A本质上就是替我们查了一次ASCII码表。底层逻辑一层层剥开会发现很多魔法其实就是查表和计算。2. getchar —— 输入单个字符cchar ch; ch getchar(); // 从键盘读取一个字符感悟getchar看起来只能读一个字符但配合循环之后可以处理整个输入。这次只学了单个字符的输入输出我已经开始好奇后面怎么处理整行字符串了——编程就是一个个小积木垒成大房子。五、今日练习练习1求各位数字之和cint num 2389; int sum 0; sum num % 10; // 个位 9 num / 10; sum num % 10; // 十位 8 num / 10; sum num % 10; // 百位 3 num / 10; sum num; // 千位 2 printf(sum %d\n, sum); // 输出 22感悟这道题看起来简单但藏着两个关键点——%取余拿到最后一位/10把最后一位扔掉。以前我总觉得学运算符没意思但真正做到拆数字这种实际问题时才体会到每个运算符都有它的用武之地。练习2小写转大写getchar putcharcchar ch; printf(请输入一个小写字母); ch getchar(); putchar(ch - 32); // 小写字母ASCII比大写大32 putchar(\n);感悟这道题让我真正理解了ASCII码表的规律——字母连续排列且大小写相差32所以不需要查表直接加减就能转换。C语言的设计处处透着这种数据有规律代码就有技巧的哲学。练习3拼接数字将37和64拼接成3476cint a 37, b 64; int result (a/10)*1000 (b%10)*100 (a%10)*10 (b/10); printf(result %d\n, result); // 输出 3476感悟这道题用纯粹的算术就能搞定取十位、取个位、乘以对应的位权再相加。六、今日总结今天从变量定义与初始化入手掌握了表达式和类型转换的规则重点练习了算术运算符特别是%取余和自增、赋值运算符、sizeof和逗号运算符。输入输出方面学会了用getchar和putchar处理单个字符。三个练习覆盖了拆数字ASCII转换数字拼接三类经典问题都是后续学习数组和循环的基础。三个核心要点记住即可变量要初始化——不初始化就是随机值调试时会很头疼类型转换看精度——低精度自动转高精度强制转要谨慎大转小会截断运算符不确定就加括号——优先级不用死记括号最稳妥今天最大的感受就是C语言不会替你兜底——数据放不放得下、类型匹不匹配编译器只管照做结果对不对全靠程序员自己把控。这种把自由和风险都交给你的设计一开始有点不适应但想通之后反而觉得踏实——出了问题锅就是自己的找起来也直接。