2025_3_30
今天学习了不少东西,感觉马上猪脑过载
学习了变量的创建、分类、存储,了解了算术操作符、单目操作符、赋值操作符,强制类型转换、printf和scanf的用法
一.变量
1.变量的创建:格式为—数据类型+变量名,在变量创建时给一个值,这种操作叫做初始化(不叫赋值) ,例如unsigned int a = 100;
2.变量的分类:局部变量(大括号内定义)和全局变量(大括号外定义)
当局部变量和全局变量同名的时候,局部变量优先使⽤
- 变量的存储:局部变量是放在内存的栈区,全局变量是放在内存的静态区,除此之外,内存中还有堆区,用于动态内存管理
二.算术操作符
1.分类:+ - * / %(求模/余)
都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双⽬操作符
2./的注意事项:除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数,如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数
例如:#include<stdio.h>
int main()
{
printf("%d\n", 10 / 4);
printf("%d\n", 10.0 / 4);
printf("%f\n", 10.0 / 4);
return 0;
} 输出结果为2;0;2.500000
3.%的注意事项:这个运算符只能用于整数,不能⽤于浮点数。负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
三.赋值操作符
1.分类:=和复合赋值
连续赋值:顺序-从右向左依次赋值
2.复合赋值符:+= -= *= /= %= >>= <<= &= |= ^=
四.单目操作符:++和-- ;++是⼀种⾃增的操作符,⼜分为前置++和后置++,--是⼀种⾃减的操作符,也分为前置--和后置--。
1.前置++(--):先+1(-1),后使⽤
2.后置++(--):先使⽤,后+1(-1)
例如:int main()
{
int a = 1;
int b = 0;
b = a++;
printf("%d\n", a);
printf("%d\n", b);
b = ++a;
printf("%d\n", a);
printf("%d\n", b);
return 0;
} 输出结果:2;1;3;3 (--也是类似)
五.强制类型转换
1.形式:(类型)
2.例如:(int)3.14将3.14强制转换为3
六.printf
1.基础用法:是在标准库的头⽂件stdio.h定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这 个头⽂件。
不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换⾏。为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符\n。
2.限定宽度(最小宽度):%5d表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的%的后⾯插⼊⼀个-号。
对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。
printf()不对正数显示+号,只对负数显⽰-号。如果想让正数也输出+号,可
以在占位符的%后⾯加⼀个+。
3.限定小数位数:希望⼩数点后⾯只保留两位,占位符可以写成%.2f
这种写法可以与限定宽度占位符,结合使⽤:%6.2f
最⼩宽度和⼩数位数这两个限定值,都可以⽤*代替,通过printf()的参数传⼊。
3.输出部分字符串:%m占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤%.ms指定输出 的⻓度,其中m代表⼀个数字,表⽰所要输出的⻓度
七.scanf
1.基础用法:原型定义在头⽂件stdio.h
2.变量前⾯必须加上&运算符(指针变量除外),因为scanf()传递的不是值,⽽是地址, 即将变量的地址指向用户输⼊的值
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加&运算符
3.输入多个变量:scanf(“%d%d%d%d\n”,&a,&b,&c,&d);处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等
4.解读⽤户输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
例如:int main()
{
int x;
float y;
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
} 输入:-12.08e-3输出结果:-12;0.000080
- scanf的返回值:返回值是—个整数,表⽰成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回0。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。
八.占位符
1.printf的占位符
占位符的第⼀个字符⼀律为百分号%,第⼆个字符表⽰占位符的类型
列举:%a:⼗六进制浮点数,字⺟输出为⼩写。
%A:⼗六进制浮点数,字⺟输出为⼤写。
%c:字符。
%d:⼗进制整数。
%e:使⽤科学计数法的浮点数,指数部分的e为⼩写。
%E:使⽤科学计数法的浮点数,指数部分的E为⼤写。
%i:整数,基本等同于%d。
%f:⼩数(包含float类型和double类型)。//float %f double - %lf
%g:6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的e为⼩写。
%G:等同于%g,唯⼀的区别是指数部分的E为⼤写。
%hd:⼗进制 short int 类型。
%ho:⼋进制 short int 类型。
%hx:⼗六进制 short int 类型。
%hu:unsigned short int 类型。
%ld:⼗进制 long int 类型。
%lo:⼋进制 long int 类型。
%lx:⼗六进制 long int 类型。
%lu:unsigned long int 类型。
%lld:⼗进制 long long int 类型。
%llo:⼋进制 long long int 类型。
%llx:⼗六进制 long long int 类型。
%llu:unsigned long long int 类型。
%Le:科学计数法表⽰的 long double 类型浮点数。
%Lf:long double 类型浮点数
%n:已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
%o;⼋进制整数。
%p:指针(⽤来打印地址)。
%s:字符串。
%u:⽆符号整数(unsigned int)。
%x:⼗六进制整数。
%zd:size_t类型
%%:输出⼀个百分号。
- scanf的占位符:
上⾯所有占位符之中,除了%c以外,都会⾃动忽略起⾸的空⽩字符。%c不忽略空⽩字符,总是返 回当前第⼀个字符,⽆论该字符是否为空格。
%c:字符。
%d:整数。
%f:float类型浮点数。
%lf:double类型浮点数。
%Lf:long double类型浮点数。
%s:字符串。
%[]:在⽅括号中指定⼀组匹配的字符(⽐如%[0=9]),遇到不在集合之中的字符,匹配将会停⽌。
如果要强制跳过字符前的空⽩字符,可以写成scanf(“%c”,&ch)即%c前加上⼀个空格,表示跳过零个或多个空⽩字符
占位符%s,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩
字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
因为%s不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个%s⼀起使⽤。这也意味着,scanf()不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外,scanf()遇到%s占位符,会在字符串变量末尾存储⼀个空字符\0
scanf()将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤%s占位符时,应该指定读⼊字符串的最⻓⻓度,即写成%[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
3,赋值忽略符
如果⽤户输⼊2020-01-01,会正确解读出年、⽉、⽇。那么⽤户可能输⼊其他
格式,⽐如2024/01/01这种情况下,scanf()解析数据就会失败。 为了避免这种情况,scanf()提供了⼀个赋值忽略符* 。
只要把*加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃