输入输出(格式化IO函数)
1、输入scanf()
(1)基本语法
scanf(“格式控制符”,变量的地址);
比如:
int a;
scanf(“%d”,&a);
float b;
scanf(“%f”,&b);
写法1:一次读取一个数据
int a;
scanf(“%d”,&a);
写法2:一次读取多个数据
int a;
float b;
scanf(“%d%f”,&a,&b);
(2)scanf遇到的问题
问题1:scanf在读取整数的时候有问题
121hello------->读取121
56.8------------->读取56
问题2:scanf在读取数据的时候,用户不配合,输入的类型不正确,该怎么解决
解决方法:scanf的返回值表示用户从键盘输入符合要求的数据类型个数
(3)详解scanf的底层原理(知道如何工作)
缓冲区:计算机内存中一块特殊的区域,这个区域专门留给scanf/printf使用
底层原理:用户从键盘输入的任何数据,都会被当成字符串存放到系统的IO缓冲区里面
scanf会依据程序员写的格式控制符,从IO缓冲区里面读取合适的字符串,然后把这个字符串转换成你需要的数据类型。
2、输出printf
(1)基本语法
printf(“格式控制符”,变量的名字);
int a=10;
printf(“%d”,a);
写法1:一次输出一个数据
int a=10;
printf(“%d”,a);
写法2:一次输出多个数据
int a=10;
int b=20;
printf(“%d%d”,a,b);
(2)详解printf底层原理
底层原理:打印的数据先存放到IO缓冲区
代码中所遇到的如下几种情况会自动刷新缓冲区(所谓的自动刷新,就是把缓冲区里面的内容显示屏幕上)
情况1:return/exit/程序结束
情况2:缓冲区满了,就会自动把缓冲区里面的内容显示到屏幕上
情况3:回车
后面会遇到printf打印不出来的问题,这里埋个伏笔,加个\n;
printf(“%d\n”,a);
C语言的运算符
1、运算符分类
(1)算术运算符
+-*/%
除法:
整数除以整数,结果取整
例:1/3=0
1/2=0
整数除以小数还是小数除以整数,结果都是小数
实际用途:
用来判断数是奇数还是偶数
用除法来求出一个整数的每一位(1234)
1234/1000 --------1
1234/100%10-----2
1234%100/10-----3
1234%10-----------4
51题型(数码管从0加到9999)
/:整除符号
%:取余符号
%:取余符号
取余:得到余数,只能针对整数取余,不能对小数取余
1%2=1
10%3=1
实际用途:用取余来限制一个数的范围
比如:产生一个随机数1111121212121,此时我想把随机数限制到一个范围,用随机数去取余100,既可以把这个数限制到(0-99) 1111121212121%100=21
(2)逻辑运算符
作用:用来表示多个条件是否满足,多个条件去一个
&& || ! 与或非
2.1逻辑与--------->并且
if(高&&富&&帅)
{
printf(“是白天\n”);//同时满足才会执行这行语句
}
else
{
printf(“努力奋斗\n”);
}
if(a>10&&b!=0)
运算规则:从左至右依次判断每个表达式的值是否为真,如果有一个表达式为假,后面的表达式不参与计算,整个表达式全为假
If(条件1&&条件2&&条件3&&条件4)
表达式有假为假
笔试题:
int a=85;
int b=5;
if((a>b)&&(a=a+10)&&(b=b-a)&&(a-b<3)&&(a=a-b+10))
printf(“a,b=%d,%d\n”,a,b);
else
printf(“a,b=%d,%d\n”,a,b); // 95 -90
2.2逻辑或|| ------->或者
运算规则:从左到右依次判断每个表达式是否为真,如果有一个为真,后面的表达式不参与计算,整个表达式为真
if(条件1||条件2||条件3||条件4)
表达式有真为真
笔试题:
int a=85;
int b=5;
if((a>b)||(a=a+10)||(b=b-a)||(a-b<3)||(a=a-b+10))
printf(“a,b=%d,%d\n”,a,b); //85 5
else
printf(“a,b=%d,%d\n”,a,b);
2.3笔试题提升难度,逻辑与与逻辑或混合计算
int a=85;
int b=5;
if((a>b)||(a=a+10)&&(b=b-a)||(a-b<3))
printf(“a,b=%d,%d\n”,a,b);
else
printf(“a,b=%d,%d\n”,a,b);
总结模型:
情况1:条件1||条件2&&条件3||条件4
if((a>b)||(a=a+10)&&(b=b-a)||(a-b<3))
整体看成逻辑或,从左到右计算,把中间的条件2和3看成整体
情况2:条件1&&条件2||条件3||条件4
if((a>b)&&(a=a+10)||(b=b-a)||(a-b<3))
整体看成逻辑或,从左到右计算,把条件1和2看成整体
情况3:条件1||条件2||条件3&&条件4
if((a>b)||(a=a+10)||(b=b-a)&&(a-b<3))
领悟:混合计算,由于&&的优先级高,所有说先用括号把&&括起来作为一个整体,其他部分(逻辑或)按照从左到右的顺序计算
2.4逻辑非!(取反)
运算规则:真--------->假 假--------->真
例子:
if(a>b)
if(!(a>b))------->if(a<=b)
(3)关系运算符
> < == != >= <=
3.1 请你把“=”和 “ ==”分清楚
=------------->赋值
==--------------->相等
经典错误示范
int a=888;
if(a==123)//容易写成a=123,有时候编译还不报错
{
}
3.2左值和右值
左值:赋值运算左边的那个式子,就叫左值
左值只能是变量名,不可以是表达式,不可以是常量
数学:x+y=10;完全ok
c语言:x+y=10;错误的
x+6=10;错误的
右值:赋值运算右边的那个式子,就叫右值
右值可以是任何合法的C语言表达式
a=a+4;
a=b+c;
3.3数值的取值范围(注意点)
int a=20;
if(10<a<100) //错的,语法上没有错,逻辑有错
编译器会这么算
第一步:10<a;
第二步:利用第一步结果,再去跟100比较
if(a>10&&a<100)
(4)位运算
作用:根据整数的二进制来计算结果,把一个二进制数清零或置1
&(与)|(或) ^(异或) ~(取反)
4.1按位与&
运算规则:根据整数的二进制来计算结果,然后根据二进制来求按位与,两个为1,就是1,有一个为0,结果为0(有0为0)
比如:23&19结果是?
第一步:23的二进制10111
19的二进制10011
第二步:10111
& 10011
------------------------------------
10011
公式1:任何二进制在跟1按位与,结果都是保持不变的
任何二进制跟0按位与,结果都是0
4.2按位或
运算规则:根据整数的二进制来计算结果,然后根据二进制来求按位或,两个为0,就是0,有一个为1,结果为1(有1为1)
比如:23|19结果是?
第一步:23的二进制10111
19的二进制10011
第二步:10111
| 10011
------------------------------------
10111
公式1:任何二进制在跟0按位或,结果都是保持不变的
任何二进制跟1按位或,结果都是1
4.3取反~
运算规则:根据整数的二进制来计算结果,然后根据二进制来求按位取反,0--->1 ,1-->0
比如:~19
第一步:19的二进制10011
第二步:计算按位取反
~10011---->01100
4.4异或^
运算规则:根据整数的二进制来计算结果,然后根据二进制来求按位异或,相同为0,不同为1
比如:23^19结果是?
第一步:23的二进制10111
19的二进制10011
第二步:10111
^ 10011
------------------------------------
00100
公式1:任何一个数跟自己异或,结果0
(5)三目运算符?:
单目运算符:只有一个操作数 ~
双目运算符:有两个目标数,+ - * / > <
三目运算符:?:
运算规则:表达式1?表达式2:表达式3
表达式1为真-------->最终结果由表达式2决定的
表达式1为假-------->最终结果由表达式3决定的
(a>b)?a:b;
(6)其他运算符
++ -- 逗号表达式 << >> 组合运算符 sizeof 成员运算符 取地址 解引用
6.1 自增和自减
自增分为两种:前置的自增与后置的自增
语法规则:
int a=98;
++a;//前置的自增,先把a的值加1,然后再使用加1之后的结果
a++: //后置的自增,先使用a原本的值,然后再把a加1
自减分为两种:前置的自减与后置的自减
语法规则:
int a=98;
--a;//前置的自减,先把a的值减1,然后再使用减1之后的结果
-: //后置的自减,先使用a原本的值,然后再把a减1
6.2逗号表达式
语法规则:变量=(表达式1,表达式2,表达式3.........);
用圆括号括起来的整体叫做逗号表达式
从左向右计算,最后的结果由最右边的表达式来决定
int a=89;
int b=45;
int c=(a++,b--,a-b);
a=90,b=44,a-b=46
6.3左移<< 右移>>
左移:把一个整数的二进制向左边移动若干位(舍弃高位),低位补0
a=0b1110 0111;
a<<3 0011 1000
比如:12<<3
第一步:计算12的二进制000000000....1100 ------->1100000 (放大)
1100*2^3
第二步:把12进制最高的三位二进制剔除,在低位补三个0
右移:把一个整数的二进制向右边移动若干位(舍弃低位),高位补0
a=0b1110 0111;
a>>3 0001 1100
比如:12>>2
第一步:计算12的二进制000000000....1100 ------->11 (缩小)
1100*2^(-2)
第二步:把12进制最低的二位二进制剔除,在高位补两个0
6.4组合运算符
+= -= *= /= %= <<= >>= &= |= ^=
a+=10;等价于a=a+10;
a<<=2;等价于a=a<<2;
6.5 sizeof求数据类型,变量的大小
sizeof(int);
6.6成员运算符
.和-> 学习结构体和共用体会用到
如果是普通的结构体变量、共用体就使用.
如果是结构体指针,共用体指针,就使用->
6.7取地址和解引用
&取地址
*解引用 学习指针会用到
2.运算符的优先级
实际搞开发,不会去记优先级
复杂的表达式用,用括号括起来
笔试题,临时抱佛脚,看看优先级
优先级的网址:运算符的优先级和结合性,《带你学C带你飞》【第一季】,C\C++交流,鱼C论坛 - Powered by Discuz!