混合运算
强制类型转换场景
整数型进行除法运算时,如果遇到结果为小数,那么存储浮点类型是,一定要进行强制类型转换。如下:
int a=10;
int b=4;
float result1=a/b;
printf("%f\n",result1);//打印结果为2.000000 因为这里做的是整形运算,因为左右操作数(指a和b)都是整型
float result2=(float )a/b;//强制类型转换 但实际上并没有把a的类型变成浮点型 只是因为表达式(float)a 是浮点型
printf("%.2f\n",result2);//打印结果正确2.50
注意:强制类型转换 并不会把变量的实际类型转换,只是把他变成了一种另外的表达式。
printf函数介绍
printf输出函数可以输出各种类型的数据,包括浮点型、字符型、整型、字符串型等,实际原理printf是将这些类型的数据格式转化为字符串后,放入标准暑促和缓存区,然后将结果显示到屏幕上。
printf函数的具体代码格式
%c | 字符 |
%d | 带符号整数 |
%f | 浮点数 |
%s | 一串字符 |
%u | 无符号整数 |
%x | 无符号十六进制数,用小写字母 |
%X | 无符号十六进制数,用大写字母 |
%p | 一个指针 |
%% | 一个‘%’符号 |
printf格式规范
int main() {
int i=10;
float f=66.66;
printf("student num=%-3d, score=%5.2f\n", i,f);
//%3d代表占三个字符位置 5.2f表示占五个位置,小数点后保留两位 默认是右对齐,-代表左对齐
return 0;
}
进制转换
计算机中,1字节(byte)为8位(bit),1位即二进制的1位,他储存0或1.int型常量的大小位4字节,所以是32位。
十进制 0-9
八进制 0-7
十六进制 0-9 a-f
例如:123 (十进制)
二进制000 0000 000 000 0000 0000 0111 1011 (除2取余逆序读)
十六进制 7b 7*16+11=123 b代表11
二进制转换八进制(实际上是每三位放在一起)
000 0000 000 000 0000 000 001 111 011 (173) 1* 8^2+7*8^1+3*8^0=64+56+3=123
代码表示如下:
int main() {
int i=123;
printf("%d\n",i);//十进制输出
printf("%o\n",i);//八进制输出
printf("%x\n",i);//十六进制输出
return 0;
}
图示为八进制内存视图 7b 00 00 00
注意:7b在前 是由于英特尔的CPU采用了小端方式进行存储数据,因此低位在前,高位在后
scanf输入函数
scanf函数原理:C语言未提供输入\输出关键字,其输入和输出是通过标准函数据来实现的。C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,会被卡住,(阻塞)。
int main() {
int i;
char c;
scanf("%d",&i);
printf("i=%d\n",i);
scanf("%c",&c);//第二个scanf不会卡住 会读取上一个回车键
printf("c=%c",c);
return 0;
}
//第二个scanf不会卡住 会读取上一个回车键‘\n’ 所以会直接打印 不会卡住
解决方法(写在第一个输出语句后)
fflush(stdin);//清空标准输入缓冲区
但是注意:如果scanf在读取函数时,读取的是整型数、浮点数、字符串、会自动忽略‘\n' ,空格符等字符。(忽略是指scanf函数执行时,会首先删除这些字符,然后再进行阻塞)。而scanf在读取%c,匹配一个字符时,不会忽略任何一个字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'。
多种数据类型混合输入
int main() {
int i,ret;
float f;
char c;
ret = scanf("%d %c %f",&i,&c,&f);//ret是scanf匹配的个数,帮助调试
printf("i=%d,c=%c,f=%5.2f",i,c,f);
return 0;
}
注意代码格式,加空格或用逗号隔开。
相关练习:输入输出