1. 数据类型转换
(1) 相同类型数据的运算结果,还是该类型;
(2) 不同类型的数据的运算结果是取值范围大的那种。
(3) 取值范围小的类型赋值给取值范围大的类型是安全的,反之不安全。
(4) 浮点数转为整数是截断(丢失小数部分,不是四舍五入)。
(5) 为了消除警告:强制类型转换(强转)可以消除从大到小的警告。可以通过下面方式把表达式的值转为任意类型:(类型)表达式,例如:
int x=10;
Float y;
y = (float)x; // x值不改变,只是将转换了的x值赋给y
2. 数据的输入输出
C语言提供了标准的输入输出库。
(1) 格式输出函数printf
基本形式:printf("控制字符串”,输出项列表),输出项可以是变量、常量、表达式,其间用逗号分隔。
格式控制字符串:格式说明符、普通字符
格式控制说明:%字符 ,例如:%c按字符型输出,%d按十进制整数输出,%u按无符号整数输出,%f按浮点型小数输出,%o按八进制整数输出,%x按十六进制整数输出,%s按字符串输出。
使用修饰符:宽度、精度、小数位数、对齐方式等。字段宽度:%6d表示以字节宽度为6字节显示一个整数。例如:
i = 123;
printf(“%6d\n”,i); // 输出:___123(有三个空格)
printf(“%06d\n”,i); // 输出:000123(补零)
j = 1234.567;
printf(“%9.3f\n”,j); // 输出:_1234.567总共占9个字段,小数点占3个字段
负号:不用负号为右对齐,有负号是左对齐。
字符*:指定输出的字段宽度,例如:
printf(“%*d\n”,w,i); // 指定字段宽度为w
printf(“%*.*f\n”,7,2,x); // 指定字段宽度为7,并且小数点后长度为2
%%两个百分号表示百分号,%t表示一个tab键。输入输出函数都在头文件,若只有printf和scanf,那么头文件可省略。
普通字符:原样输出的字符,可打印字符:直接写出字符,不可打印字符:使用转义字符\n,\t,\a
(2) 字符输出函数——putchar(将一个字符输出在显示屏上,显示参数可以是字符变量、字符常量、字符ASCII码)
putchar('A'); // 显示大写字母A
putchar(97); // 显示小写字母a,里面数字都表示ASCII码
(3) 格式输入函数——scanf
基本形式:scanf(”控制字符串”,输入项列表)
注意:接收数据的变量必须用其地址表示,加一个&!
控制字符串与输出的表示方法类似,注意不同点:字符*:输入时用来跳过相应的数据(输入*用来跳过,输出*用来控制字段长度)!例如:
scanf("%d%d",&i,&j); // 输入分别存到i和j中
scanf("%*d%d",&i,&j); // 跳过第一个数,读取第二个数并存到i中
空格字符:输入字符型数据时,用来跳过输入流中所有空格字符(不管有几个空格字符,输入一个空格字符表示跳过所有空格字符)。例如:
若输入45 20 a:
scanf("%d%d%c",&i,&j,&ch); // 输出会是45 20 空格
scanf("%d%d %c",&i,&j,&ch); // 输出是45 20 a
/* 注意:只有输入字符型数据时需要加空格跳过所有空格,输入数值型数据时不需要,它会自动跳过! */
可打印字符:去除输入数据流中与可打印字符相同的字符
scanf("%d%d",&i,&j); // 注意:输出格式按照后面那里来,后面是空格那么输出是空格,输出是逗号那么输出是逗号
(4) 字符输入函数——getchar
基本形式:getchar(),无参数,只能接收一个字符。
作用:从键盘输入一个字符,函数的返回值为该字符的ASCII码,使用时,通常将返回值赋予某个字符变量或整型变量。
程序1:输入一个字符,输出它的前导/后续字符,并分别按照字符和整数格式输出。
思路:前导:ASCII码-1,后续:ASCII码+1.
/* 输入一个字符,并输出它的前导、后续字符,并分别按照字符、整数输出 */
/*正确的程序 */
#include
#include
int main()
{
char c;
int c1, c2;
c = getchar();
c1 = c - 1;
c2 = c + 1;
printf("%c\t%c\t%c\n", c1,c,c2);
printf("%d\t%d\t%d\n", c1, c, c2);
system("pause");
return 0;
}
程序2:温度转换,将输入的摄氏温度值转化为华氏温度输出。
思路:转换公式:C=5/9*(F-32)
/* 将摄氏温度转换为华氏温度 */
/*正确的程序 */
#include
#include
int main()
{
float Ctemp,Ftemp;
printf("请输入一个摄氏温度值:\n");
scanf_s("%f", &Ctemp);
Ftemp = Ctemp * 9 / 5 + 32;
printf("转换后的华氏温度为:%.2f\n", Ftemp);
system("pause");
return 0;
}
程序3:小明家廉租房
/* 小明家 */
/*正确的程序 */
#include
#include
int main()
{
float xm = 0, bb = 3.5, mm = 1.5,remain;
if ((xm + bb + mm) > 6)
{
printf("小明家不满足廉租房要求\t");
remain = (bb + mm + xm) - (300 / 10000 * 12);
printf("小明家还剩余%.2f万元\n", remain);
}
else
{
printf("小明家满足廉租房要求\t");
remain = (bb + mm + xm) - (1000 / 10000 * 12);
printf("小明家还剩余%.2f万元\n", remain);
}
system("pause");
return 0;
}
我编写的程序出现这样一个错误,原因是因为if-else忘记加{ }。
程序3:输入两个整数,输出它们的和。
/* 输入两个整数,输出它们的和 */
/* 我写的程序 */
# include"stdio.h"
#include"stdlib.h"
int main()
{
int a, b,c;
printf("请输入两个整数%d%d:;\n"); // 错误:printf没有为格式字符传递足够的参数,应该把%d去掉!
scanf_s("%d%d", &a, &b);
c = a + b;
printf("这两个整数的和为%d+%d=%d", a+b=c); // 错误(1):printf没有为格式字符传递足够的参数(应该把后面的+和=去掉)
// 错误(2):“=”左操作数必须为左值(把后面的+和=去掉)
system("pause");
return 0;
}
/* 正确的程序 */
# include"stdio.h"
#include"stdlib.h"
int main()
{
int a, b,c;
printf("请输入两个整数:;\n");
scanf_s("%d%d", &a, &b);
c = a + b;
printf("这两个整数的和为%d+%d=%d", a,b,c);
system("pause");
return 0;
}
我的错误:输出里的格式字符,后面数值只需要一一对应就可以,后面形式与前面格式字符不需要格式保持一致。
编程后回答一下问题:
(1) 空格、回车、逗号分隔输入的两个整数,分别输出什么?
scanf_s中间没有任何分隔符时:空格正常,回车正常,逗号不正常。说明:除了格式字符之外的其他字符都需要原样输入。但若原样输入了逗号,此时再用空格和回车会报错。
(2) 用回车分隔输入,scanf_s("%d\n%d\n",&a,&b)这样对吗?
不对,这样会没有输出结果。若想回车输出,那么直接什么都不加就可以。
(3) 如果要求输入符号+,也就是输入3+5,输出3+5=8,怎么写?(见下面程序)
(4) scanf_s对字符类型数据有没有特殊要求?
对字符型数据,scanf_s需要指明字符的个数(和scanf函数的不同之处)
# include"stdio.h"
#include"stdlib.h"
int main()
{
int a, b, c;
char ch;
printf("请输入两个整数:;\n");
scanf_s("%d+%d", &a, &b);
scanf_s("%c\n", &ch,1); // scanf_s函数用字符类型数据时,必须注明字符个数!!
c = a + b;
printf("%c\n", ch);
printf("这两个整数的和为%d+%d=%d\n", a, b, c);
system("pause");
return 0;
}
总结:
1. 字符型的最大值、最小值是多少?
字符型数据占1个字节(8位),是有符号的,最高位是符号位,因此它的范围是-128~127。2个字节的无符号整数的最大值是多少? 2^16-1。
2. 'x'和"x"什么区别?
'x'是字符x,"x"是字符串x,除了存储x的ASCII码值,还要存储字符串结束符\0,所以占两个字节空间。
3. '0'和'\0'相等吗?
不相等!'0'的ASCII码值为48,'\0'的ASCII码值是0
4. sizeof("computer")的值是多少?
9。因为字符串以NULL或者'\0'结尾。
5. int I = 33/4
I的值为8,整型除以整型数据还是整型。
6. "= ="和"="的区别?
“= =”是等号,“=”是赋值。
7. &&和&, ||和|
&&是逻辑与,&是位与。
||是逻辑或,|是位或。
8. 位运算能对浮点型和双精度型变量操作吗?
不能!位运算只针对整型数据。
9. 数据类型转换,能不能改变变量的数据类型和值?
不改变,只是进行类型转换,不改变变量本身的类型和值。
10. 强制类型转换用括号()