基本输入输出
C语言中所有的输入输出都是调用系统函数,其头文件为stdio.h
1.字符
转义字符
\n:换行 相当于敲了一下回车
\t:跳到下一个tab位置,相当于敲一下tab键
\0:结束符号
2、字符的输入输出
getchar :从用户输入获取一个字符。
等待输入,直到获取到空格,回车也作为有效输入。输入多个只获取第一个字符。
putchar :根据ascii码打印字符
注意!!!在数字后面紧跟着要输入字符的时间,因输入是从输入缓冲区取得输入的 数据,在要输入字符时,因为在输入数字时会有一次回车,而回车也是字符,所以会被接收而不能正确存入用户想存储的字符 所以需要在输入字符前先吸收掉之前输入数据时的回车 可以用getchar()或者在scanf(“% c”,&avriable);在格式化控制符中%c中加一个空格变成% c;
建议使用在格式化控制符前加空格的方式 因为这样的输入可以吸收回车并且能过滤空格;
3、printf &scanf
printf(“格式化字符串",参数列表);
格式化控制符(占位符)
%d输出一个int类型的变量的值。
%f输出一个float类型的变量的值。
%lf输出一个double类型变量的值。
%c输出一个char 类型的变量的值。
%d或者%ld的其他控制符:
1.%md:m代表这个整数占多少位,m是一个整数
实际数字不足的位数用空格补齐
如果实际的整数的位数大于或者等于m时,就按实际输出
m也可以是负数,那么代表不足位在后面补齐
2.%0md:跟上面一样的作用,只不过不足位用0补齐(!!!注意重点!!!)
3.不能用其他的来补齐,只能用0
%f或者%lf的其他控制符
float是加上小数点一共7位有效,也就是小数点后6位是有效数字
double是加上小数点一共15位有效,也就是小数点后14位是有效数字
1.不管是float还是double默认会输出小数点后6位
2.%.mf:m代表保留小数点后几位,m是一个整数,最后一位会四舍五入 (重点)
3.%n.mf:n代表总共的列数(小数点也算1列),m还是跟上面的一样,代表保留几位小数
n可以控制列数,如果实际列数小于n时,那么不足部分以空格补齐
但是如果实际列数>=n时,就按实际的输出
n<=m时,就按照m规定的输出
scanf("格式化字符串",参数地址列表);
scanf 不可以显示非格式化字符,即不能显示提示字符串。
scanf 根据 回车,换行,TAB键,空格来分隔字符
注!如果格式化字符串中有非格式化字符,输入的时候也要输入该非格式化字符
例如:接收2个整数
scanf("%d %d",&a,&b);
接收字符
scanf("%c%c%c",&a,&b,&c);
接收宽度控制
scanf(“%5d",a);接收前5位输入
注意:在参数地址列表里一定要加取地址符&
4、输入缓冲区
即用户输入先放在输入缓冲区,然后去取,如果符合要求就会被取走,不然就继续寻找
输入回车,把数据送入到缓冲区 ,且回车\n也是一个字符
运算符
表达式是由运算符,变量,常量组成的式子,表达式有确定的值,跟类型
单目运算符:一个操作数
双目:2个操作数
三目:3个操作数
1、常用运算符
算术运算符:+,-.*,/,%
除“/”运算:当/两边的都是整数时,结果一定为整数
当有一个为浮点型数据时,结果一定为浮点型,(float或者是double由那个浮点型数据决定)
求余”%”运算:取余结果的正负性,只取决于左边那个操作数,与右边的操作数无关
注意:浮点型数据不能进行取余运算!!!
自增自减运算符:++,—
a++,++a,a—-,—-a;当自增(自减)运算符在左边时,是先进行自增(自减),然后再用自增(自减)后的数据参与运算,若在右边,则先使用原数据参与运算,再进行本身的自增(自减)
关系运算符:>,>=,<,<=,==,!=
逻辑运算符:||,&&,!
赋值运算符:=,+=,-=,*=,/=
例:赋值:a=b=c=5;可以, 从右向左运算
变量在声明的时间不可以,int a=5,b=5,c=5;
应该:
int a=5;
int b=5;
int c=5;
逗号运算符:,
即(表达式1,表达式2,表达式3,表达式4……表达式n)
计算机会从表达式1依次运行,最终结果以最后一个表示式的结果为整个逗号表达式的结果。
注意:所有的表达式都会运行
三目运算符:条件运算符 表达式1?表达式2:表达式3
例如x>y?x:y;
语句:执行表达式1,如果表达式1成立,则执行表达式2,否则执行表达式3
注意:三目运算和后边要学到的if-else可互换,所以建议在语句块较短时,优先选择三目运算
sizeof() 类型或者表达式
2、优先级
int a;
printf("%d\n",1+2>2);//算数>关系
printf("%d\n",0>2||1);//关系>逻辑
printf("%d\n",a=0||1);//逻辑>赋值
a= 1,3;//赋值>逗号
printf("%d",a);
括号(可以嵌套) > 单目运算符 (++ -- !) > 算术运算符 (* / % 大于 + -) > 关系运算符(> >= < <= 大于 == !=) > 逻辑运算符(&&大于||) > 赋值运算符 (= /= %= *= += -=) > 逗号运算符(,)
算术运算符: (* / %) >( + -)
逻辑运算符: && > ||
断路特性 &&,|| 运行前半,值已经确定,后半表达式不会运算执行
(表达式1) &&(表达式2) 如表达式1为假,则表达式2就不会被执行
(表达式1) ||(表达式2) 如表达式1为真,则表达式2就不会被执行
3、类型转换
不管后面的表达式怎样,系统会自动转成左边的数据类型
自动类型转化
(高精度—>低精度,会损失精度)
int a = 10.2 //右边是个表达式,类型是double,值是10.2,接收是int, 会损失精度
int b = 564
char ch = b,接收的char,截断,只保留低位
强制类型转化 (类型说明符) 表达式
float f = (float)7, 7被强制转成float型
多种类型混合运算
1、与long运算,转成long
2、float参与运算,转成double运算.如果运算范围没有超过float的表示范围,不会转化
3、char 和short运算的时候,转成 int
使用原则:防御式编程,运算时选取合理数据类型,清楚运算的结果的范围。接收的类型和表达式类型尽量一致。