怎么起一个好名字 ----> 见名知意
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
//standard input output
3.三组输入输出函数单个字符输入输出
getchar
putchar
格式化的输入输出
printf
scanf
字符串的输入输出 (*)
gets //string --- 一串字符 "abc"
puts
1. 单个字符输入输出
getchar
putchar
getchar() //int getchar(void); //函数的原形,从以下三点来把握一个函数
功能:
获取一个(内存中数据缓冲区)字符
参数:
void --空类型 //表示没有参数
返回值:实际读到一个无符号字符--->返回一个int型 //接收返回值相当于一个赋值的操作
unsigned char ---> int // 短类型给到长类型,此转换是隐含的
从键盘(内存中数据缓冲区)读到值,返回给程序用(程序中用的是返回值)
int putchar(int c);
功能:
输出一个字符
参数:
int c // 要输出的 字符的 ascii码值
返回值:unsigned char ---> int // 短类型给到长类型,此转换是隐含的
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 数字
对浮点数用
表示 控制 输出的小数位数
//会出现四舍五入的进位
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()把空白符读走 //有瑕疵,但不失为一种想法