嵌入式学习 Day4

发布时间:2024年01月22日

一. 给变量起名

怎么起一个好名字 ---->?见名知意?

1. 能用单词的尽量用单词

? ? count //计数?

? ? cnt ?//a e i o u (常省略元音字母做变量)

2. 避免用拼音?

? ? huiwenshu //hws?
? ?
3. 格式?

? ? 驼峰命名法?
? ? StudentCount? ? //大驼峰? ?

? ? studentCount? ? //小驼峰?
? ? student_count? ?//内核命名法 (这个好)

二. 赋值运算的补充

赋值运算要求: 左右两边做到 类型匹配?

不同类型的数据间混合赋值:

int = double ?//高精度给低精度赋值 --精度丢失?
double = int ?//没啥影响

short = int ? ?//长类型数据 给到 ?短类型 ? --高位截断?
int ? = short ?//?
? ? ? ? ? ? ? ? ? ? //无符号 短类型 ?此时 高位补 0
? ? ? ? ? ? ? ? ? ? //有符号 短类型? 高位按符号位扩展 (按符号位扩展数值极性不变)

?? ??? ??? ? ?
总结:
1.高精度 给 低精度 --- 精度丢失?
2.长类型 给 短类型 ?--- 高位截断
3.短类型 给 长类型
? ? ? ? ? ? ? ?//无符号 短类型 ?高位补 0
?? ??? ??? ? ? //有符号 短类型 ?高位按符号位扩展

?三. 语句

1.控制语句?


2.函数调用语句?

printf("hello world") ;? ?//函数加分号

3.表达式语句 ?

1+2 ;? ? //表达式加分号

?i++;

4.空语句

;? ?// 空语句 不会形成 机器指令,但仍要占用到CPU

5.复合语句?

{
? 多条语句
}?

?四. 输入输出

总览:

1.c语言本身并不提供输入输出功能,输入输出由调用c的函数库实现?
??
2.标准的输入输出库?

?#include <stdio.h> //standard input output?
?
3.三组输入输出函数?

单个字符输入输出?

getchar

putchar?

格式化的输入输出?

printf

scanf

字符串的输入输出 (*)?

gets ?//string --- 一串字符 "abc"

puts?
?

1. 单个字符输入输出?
getchar
putchar?
?? ?
getchar() //

int getchar(void);? //函数的原形,从以下三点来把握一个函数?
功能:
? ? 获取一个(内存中数据缓冲区)字符?
参数:
? ??void --空类型 //表示没有参数?
返回值:

? ? 实际读到一个无符号字符--->返回一个int型? ? ? ?//接收返回值相当于一个赋值的操作
? ? unsigned char ---> int? ? // 短类型给到长类型,此转换是隐含的
? ? 从键盘(内存中数据缓冲区)读到值,返回给程序用(程序中用的是返回值)


?? ?成功 返回读到的字符的 ASCII码值 (高位补0)
?? ?失败 EOF (代表-1这个数值)
?? ?

?int putchar(int c);
?功能:
? ? 输出一个字符?
?参数:
? ? int c? // 要输出的 字符的 ascii码值?
?返回值:

? ? unsigned char ---> int? ? // 短类型给到长类型,此转换是隐含的


? ? 成功 是输出的 字符的ASCII的值
?? ?失败 EOF?
?? ?


2. 格式化的输入输出?
printf ?//格式化输出函数
int printf(const char * ?format, ...);
... //可变参?
? ? //参数个数是变化的?

(1) 格式:
printf("格式化控制字符串",输出列表);

(2) 格式控制字符串:
printf("b= %d\n",10);
普通字符:?
? ? ? ?原样输出?
占位符:
? ? ? ?1. 占了一个位置,最终输出效果是将输出列表中对应的参数,以占位符指定的格式输出
? ? ? ?2. 占位符 与 输出列表的匹配?从左到右逐个对应?
? ? ? ?3.?如果 占位符个数 大于 输出列表参数个数 , 多余的占位符?输出是随机值?


占位符:
??
? //整型?
? %d ?以 有符号 十进制 格式 输出?
? %u ?以 无符号 十进制 格式 输出
? %x ?以 十六进制 格式 输出
? %X ?以 十六进制 格式 输出 ,但是对应的a b c d e f 都是大写
? %o ?以 八进制 格式 输出
? //浮点数?
? %f ?以小数的形式输出,默认保留6位小数
? %g ?以 更简洁 的方式输出小数?,同时不会输出多余的0 (进位效果)
? %e ?以 科学计数法形式 输出
? %E ?以 科学计数法形式 输出,输出结果中 e 大写?
? //字符 ? ?
? %c ?以 字符的 格式 输出 //将对应的ASCII码值的 字符形式输出?
? %s ?以 字符串 格式 输出?

? 辅助控制符:
??
? %[辅助控制符]d
??
? #?
? ? ?%#x? ? //表示 输出十六进制 的前缀?
?? ? %#o? ? //表示 输出八进制 的前缀
????
? m ?
? ? ?数字 --- 输出的字符宽度?
?? ? 实际的参数的宽度 > m ?则以实际参数的宽度为准?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?< m ?默认右对齐 ,前面的空位补空格?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?左对齐 加一个 负号(-)
??
? .n 数字?
? ? ?对浮点数用?
? ?? 表示 控制 输出的小数位数?
??? ?//会出现四舍五入的进位

//右对齐,前可补零
? ? ?对字符串用
?? ? 表述输出 字符串 前n位?

??
??
? ?l // long 类型?
? ?ll //long long 类型

??// 匹配是主要指二者的空间大小要匹配

??//从空间角度来看虽然二者都是八个字节,但从语法角度来看long long int和%ld所期待的long int是不同的
? ?
? ?h ?//half --一半 ?2个字节?
? ?hh //1个字节?? ?

? ?

?练习:
?? ?设a,b为int型变量,
?? ?x,y为float型变量,
?? ?c1,c2为char型变量,
?? ?且设a=5,b=10,x=3.5,y=10.8,c1=’A’,c2=’B’。
?? ?为了得到以下的输出格式和结果,请写出对应的printf语句。


?? ?(1)a = 5, b = 10, x + y = 14.3
?? ?(2)x - y = -7.3, a - b = -5
?? ?(3)c1 = ’A’ or 65(ASCII) c2 = ’B’ or 66(ASCII)?

?

scanf?
int scanf(const char *format, ...);

(1)?格式:
scanf("格式控制字符串",地址列表)

(2) 普通字符:?
? ? ? ?原样输入 //不建议写?
(3) 占位符:
? ? ? ?占了一个位置,将输入的数据,转换为?占位符 指定的格式,再放到 地址列表对应的一块内存空间上?
? ? ? ?占位符 也决定 能识别的 字符的范围?

占位符:
??
? //整型?
? %d ?将输入的数据 转换为 有符号 十进制 格式?
? %u ?将输入的数据 转换为 无符号 十进制 格式?
? %x ?将输入的数据 转换为 ?十六进制 格式 输出
? //%X ?将输入的数据 转换为 ?十六进制 格式 输出 ,但是对应的a b c d e f 都是大写
? %o ?将输入的数据 转换为 ?八进制 格式 输出
? //浮点数?
? %f ?将输入的数据 转换为 小数的形式
? %g ?
? %e ?
? %E ?
? //字符 ? ?
? %c ?以 字符的 格式 输入?//将 字符 对应的ASCII码值?输入?
? %s ?以 字符串 格式 输入?


?注意:
? ? 1.第二个参数注意一定要写 & (取地址)
?? ? ?Segmentation fault (core dumped) //程序试图访问不能被访问的空间

?//段错误

//随机值
?? ?2.多个数据输入时
?? ? ?以空白符作为分割符
?? ? ?空白符:
?? ? ?空格?
?? ? ?回车?
?? ? ?tab?
?? ?3.浮点型数据输入时?
?? ? ?double -- %lf?
?? ? ?//不匹配
?? ? ?类型要匹配?
?? ? ?int - %d
?? ? ?long - %ld
?? ? ?long long - %lld


?? ?4.辅助控制符?
?? ? ?m ?宽度 -- 输入的宽度?
?? ? ?
?? ? ?达到宽度时,输入匹配结束?
?? ? ?只能获取到前m个数据?
?? ? ?
? ? 5.scanf匹配结束的条件?
?? ? 123 456 789
? ? ?scanf("%d%d%d",&a,&b,&c);?? ??
?? ??
?? ? a.空白符?
?? ? b.指定宽度?
?? ? 123456
?? ? scanf("%3d",&a); //123
?? ??
?? ? c.非法字符
? ? ?123a45?? ??
?? ? scanf("%d",&a);
?? ??
?? ?6. %c 字符占位符?
?? ? ?几乎可以识别键盘输入的任何字符?
?? ? ?
?? ? ?scanf("%c %c %c",&c1,&c2,&c3); // 一个空白符 --匹配任意多个空白符?
?? ??
? ??? ? ?%*c // 表示 跳过一个 数据项?
?? ? ?


练习:?
? ?编写程序从终端输入数据给到变量,
? 并打印变量的值
? ?a = 3 b = 5 x = 8.5?
? ?y = 71.82 c1= 'A' c2 = 'a'

为何出现这种情况:

键盘 -----[输入缓冲区]-------->内存(程序)

匹配机制导致,%d%d%f%f%c%c都是顺序的在输入缓冲区内匹配拿走数据,而我们在多个数据输入时,以空白符作为分割符,因此空白符也在输入缓冲区内,由于%c 字符占位符?
几乎可以识别键盘输入的任何字符 ,空白符、A被%c%c顺序识别拿走,导致打印出错。

如何避免这种情况:

1.连着打? ? ? ? ? //3? 5? 8.12? 71.8Aa

2.利用一个空白符可以匹配任意多个空白符? ? ?? ? ? ? //scanf("? ?%c? ? %c",&c1,&c2);

3.利用%*c ?跳过一个 (输入缓冲区的)数据项? ? ? ?//scanf("%*c%c%*c%c",&c1,&c2);

4.利用getchar()把空白符读走? ?//有瑕疵,但不失为一种想法

?

?

?

文章来源:https://blog.csdn.net/qq_56733950/article/details/135671088
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。