void main()
{
char a;
int b;
a=0x1234;
b=0x1234;
printf(\"a=%x,a=%d,b=%x,b=%d\\n\
}
输出:a=34,a=52,b=1234,b=4660
解释:由于变量a的类型是char ,该类型的数据在内存中占据1个字节的存储空间,当为其赋一个整数(int类型的数据在内存中占据4字节的存储空间)值时,C编译器必须进行数据类型转换后才能赋值,编译器将4字节中最低字节中的数值(0x34)赋给变量a,因此a的值就是0x34,用十进制表示为52。变量b的数据类型与要赋的值类型完全相同,无需转换,因此b的值就是0x1234,用10进制表示为4660。
2. 运行下面程序并写出下列程序的输出结果,解释ch2的输出。
#include \"stdio.h\"
void main()
{
char ch1,ch2;
ch1=getchar();
ch2=getchar();
printf(\"\\n*****ch1=%c,%d*****\\n\
printf(\"\\n*****ch2=%c,%d*****\\n\
}
输入:a回车
输出:
A
*****ch1=A,65*****
*****ch2=
,10*****
解释ch2的输出: 本程序的功能是从键盘输入两个字符,并分别以字符格式(%c)和10进制数格式(%d,该数就是字符的ASCII码值)输出。当从键盘输入a回车后,变量ch1将读入字符a,变量ch2将读入换行符 '\\n'(ASCII码值为10),然后按指定格式进行输出。
我不能理解:明明输入了回车,为什么却变成了换行符?
答:这是因为Unix的缘故。在Unix中,一行的结束是以单独的换行符'\\n'为标志的;而有些系统中,一行的结束是以回车符'\\r'+换行符'\\n'为标志的。为保证C程序的可移植性,C语言的输入输出库函数自动将行结束标志(不管它是什么)一律转换为换行符。
3. 改正程序中的错误,使程序能输出正确结果(即输入输出相同)。
#include void main()
{
float a;
scanf(\"%f\&a);
printf(\"a=%f\\n\
}
①将转换说明%d改为%f
②在变量a的前面增加取地址运算符&
4. 运行下面程序,注意结果是否正确,应怎样改?
#include void main()
{
double a;
scanf(\"%lf\
printf(\"a=%lf\\n\
}
①去掉%f后的空格(这个空格是不是特别讨厌?)
②将转换说明%f改为%1f
5. 运行下列输出语句,观察输出结果的异同点。
#include \"stdio.h\"
void main()
{
printf(\"%d\\n\
printf(\"%5d\\n\
printf(\"%f\\n\
printf(\"%12f\\n\
printf(\"%e\\n\
printf(\"%13e\\n\
}
输出结果如下,自己观察吧:
42
42
123.540000
123.540000
1.235400e+002
1.235400e+002
6. 输入语句scanf(\"a=%f,b=%f c=%f\,要求给a赋予3.12,b赋予9.0,c赋予10.0,写出正确的输入形式。
正确的形式:a=3.12,b=9.0 c=10.0
测试代码如下:
#include void main()
{
float a,b,c;
scanf(\"a=%f,b=%f c=%f\
printf(\"a=%f,b=%f c=%f\\n\
}
如何理解scanf()格式字符串中的空白符?
当在格式字符串中遇到一个或多个连续的空白字符时,scanf函数从输入中重复读空白符(空格、制表符、换行符等)直到遇到一个非空白符为止。在格式字符串中,所有空白符都是等价的,格式字符串中一个空白符都可以匹配任意数量的空格、换行符或其他空白字符。
7. 试分析下列程序的输出结果。
#include \"stdio.h\"
void main()
{
unsigned short int a=65535;
short int b=-1;
printf(\"a=%hd,%ho,%hx,%hu\\n\
printf(\"b=%hd,%ho,%hx,%hu\\n\
}
输出:
a=-1,177777,ffff,65535
b=-1,177777,ffff,65535
为什么a和b两个变量的输出结果完全相同呢?这是因为a和b在内存中的值完全相同,而变量的数据类型则决定了如何解释这个值。
8. 实现输入圆柱体的底面半径和高,输出其体积(C语言中的乘号是 *)。
代码如下:
#include void main()
{
float r,h,v;
printf(\"Enter radius and height:\");
scanf(\"%f%f\
v=3.14*r*r*h;
printf(\"Volume is: %f\\n\
}
9. 编程实现输入一个整数,分别用无符号方式、八进制方式、十六进制方式输出。
代码如下:
#include void main()
{
int a ;
printf(\"Enter a number:\");
scanf(\"%d\
printf(\"unsigned a = %u\\n\
printf(\"octal a = %o\\n\
printf(\"hexadecimal a = %x\\n\
}
10. 编程实现输入一个字符,输出这个字符的ASCII码。
代码如下:
#include void main()
{
char ch ;
printf(\"Enter a char:\");
ch=getchar();
printf(\"ASCII CODE(%c)= %d\\n\
}
11. 输入两个整数x和y,交换它们的值并输出。
代码如下:
#include void main()
{
int a,b,t ;
printf(\"Enter two number:\");
scanf(\"%d%d\
printf(\"a=%d,b=%d\\n\
t=a;
a=b;
b=t;
printf(\"a=%d,b=%d\\n\
}
12. 编程实现输入一个double类型的正数,对第三位小数进行四舍五入处理后(不使用函数及类型运算符)输出,输出格式整数部分占12位,小数点后两位。
代码如下:
#include void main()
{
double a;
printf(\"Enter a double number:\");
scanf(\"%lf\
printf(\"a=%15.2f\\n\
}
2.4 注意事项
1. 注意scanf( )函数中需要的是地址列表。
2. 用scanf()、printf()输入输出不同数据类型,需要不同的格式控制符,否则结果可能错误。
3. 不同数据类型的精度和表达范围不同,编程时注意选择合适的数据类型。