本章:
两大数据类型:
整数类型和浮点数类型(注意:char也是整数类型)
3.1
#include <stdio.h>
int main()
{
float weight;
float value;
printf("Are you worth your weight in platinum?\n");
printf("Let`s check it out.\n");
printf("Please enter your weight in pounds:");
//获取用户输入
scanf("%f",&weight);
getchar();//读取换行符,输入完毕
getchar();//程序暂停,准备进行下一行
value = 1700*weight*14.5833;
printf("Your weight in platinum is worth $%.2f.\n",value);
printf("You are easily worth that!If platinum prices drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}
scanf()函数用于读取键盘的输入。%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量。scanf()函数使用&符号表明找到weight变量的地点。
作用:
scanf()函数读取用户从键盘输入的数据,并把数据传递给程序;printf()函数读取程序中的数据,并把数据显示在屏幕上。
char关键字用于指定字母和其他字符(如,#、$、%和*)。另外,char类型也可以表示较小的整数。
浮点数:
要理解浮点数和整数的储存方案不同。计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分。
十进制下,可以把7.0写成0.7E1。这里,0.7是小数部分,1是指数部分。
注意:因为在任何区间内(如,1.0到2.0之间)都存在无穷多个实数,所以计算机的浮点数不能表示区间内所有的值。浮点数通常只是实际值的近似值。例如,7.0可能被储存为浮点值6.99999。
获取值的方法:1.赋值。 2.通过函数获得。如scanf。 3.初始化变量
最好不要把初始化的变量和未初始化的变量放在同一条声明中。
如图所示:
在int声明变量的时候就已经创建了内存空间,而不是赋值之后才有。
%d 称为转换说明,它指定了printf()应使用什么格式来显示一个值。d指明了打印整数。格式化字符串中的每个d都与待打印变量列表中相应的int值匹配。
3.2 print1.c
/*print1.c - 演示printf()的一些特性*/
#include <stdlib.h>
int main()
{
int ten = 10;
int two = 2;
printf("Doing it right:");
printf("%d minus %d is %d\n",ten,2,ten-two);
printf("Doing it wrong:");
printf("%d minus %d is %d\n",ten,5);//遗漏第三个参数
return 0;
}
注意:使用printf()函数时,要确保转换说明的数量与待打印值的数量相等。
3.3 base.c
/*base.c--以十进制、八进制、十六进制打印十进制数100*/
#include <stdio.h>
int main()
{
int x = 100;
printf("dec = %d; octal = %o;hex = %x\n",x,x,x);
printf("dec = %d; octal = %#o;hex = %#x\n",x,x,x);
return 0;
//结果:dec = 100; octal = 144;hex = 64
// dec = 100; octal = 0144;hex = 0x64
}
进制:
0x或0X前表示十六进制值,所以十进制数16表示成十六进制是0x10或0X10。与此类似,0前表示八进制。例如, 十进制数16表示成八进制是020。
如果要在八进制和十六进制值前显示0和0x前,要分别在转换说明中加入#。
其他数据类型:
short int 占用的存储空间可能比int类型少。
unsigned int或unsigned只用于非负数。
使用多种整数类型的原因:
C语言只规定了short占用的存储空间不能多于int,long占用的存储空间不能少于int。这样规定是为了适应不同的机器。
个人计算机上最常见的设置是,longlong占64位,long占32位,short占16位,int
占16位或32位。
int类型那么多,应该如何选择?首先,考虑unsigned类型。这种类型的数常用于计数,因为计数不用负数。而且,unsigned类型可以表示更大的正数。其他的int值因你数据的大小而选择。
要把一个较小的常量作为long类型对待,可以在值的末尾加上l(小写的L)或后缓。使用L后缓更好,因为l看上去和数字1很像。因此,在int为16位、long为32位的系统中,会把7作为16位储存(int),把7L作为32位储存(long)。
整数溢出:
当达到它能表示的最大值时,会重新从起始点开始。整数i也是类似的情况。它们主要的区别是,在超过最大值时,unsignedint类型的变量了从0开始;而int类型的变量i则从-2147483648开始。
3.4 print2.c
/*print2.c--更多printf()的特性 */
#include <stdio.h>
int main()
{
unsigned int un = 3000000000;
short end = 200;
long big = 65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n",un,un);
printf("end = %hd and not %d\n",end,end);
printf("big = %ld and not %hd\n",big,big);
printf("verybig = %lld and not %ld\n",verybig,verybig);
char beef = '\a';
printf("%c",beef);
return 0;
}
打印unsigned int类型的值,使用%u转换说明,打印long类型的值,使用%ld转换说明。%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型整数。
printf(),对于short类型,可以使用h前缀。%hd表示以十进制显示short类型的整数,%ho表示以八进制显示short类型的整数。 h和l前都可以和u一起使用,用于表示无符号类型。例如,%lu表示打印unsigned long类型的值。
3.5 charcode.c
/*charcode.c-显示字符的代码编号*/
#include <stdio.h>
int main()
{
char ch;
printf("Please enter a character.\n");
scanf("%c",&ch);
printf("The code for %c is %d.\n",ch,ch);
return 0;
}
3.6 altnames.c
/*altnames.c -- 可移值整数类型名*/
#include <stdio.h>
#include <inttypes.h>
int main()
{
int32_t me32;
me32 = 45933945;
printf("First, assume int32_t is int: ");
printf("me32 = %d\n",me32);
printf("Next, let's not make any assumptions.\n");
printf("Instead, use a \"macro\" from inttypes.h ");
printf("me32 = %" PRId32 "\n",me32);
return 0;
}
3.7 showf_pt.c
/* showf_pt.c -- 以两种方式显示float类型的值 */
#include <stdio.h>
//有问题待解决!!!
int main(void)
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5;
printf("%f can be written %e\n", aboat, aboat);//f打印的是float或double。e打印的是科学计数法的格式
//下一行要求编译器支持C99或其中的相关特性
printf("And it's %a in hexadecimal, powers of 2 notation\n", aboat);
printf("%f can be written %e\n", abet, abet);
printf("%Lf can be written %Le\n", dip, dip);//LF,Le说明dip是long double。尽量用大写L,因为小写和数字1难以区分!
//这里第三个输出结果和书上不一致!!
return 0;
}
3.7.1 floaterr.c
/*floaterr.c--演示舍入错误*/
#include <stdio.h>
int main()
{
float a,b;
b = 2.0e20 + 10;
a = b - 2.0e20;
printf("%f\n",a);
return 0;
}
//数值越界,计算机缺少足够的小数位来完成正确的运算。
3.8 typesize.c
/* typesize.c -- 打印类型大小 */
#include <stdio.h>
int main(void)
{
/* C99为类型大小提供%zd转换说明 */
printf("Type int has a size of %zd bytes.\n",sizeof(int));
printf("Type char has a size of %zd bytes.\n",sizeof(char));
printf("Type long has a size of %zd bytes.\n",sizeof(long));
printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
printf("Type double has a size of %zd bytes.\n",sizeof(double));
printf("Type long double has a size of %zd bytes.\n",sizeof(long double));
return 0;
}
效果:
检验了一下,%zd和%d效果没有区别。只是%zd用来特定表示sizeof()的返回类型
3.9 badcount.c
/* badcount.c -- 参数错误的情况 */
#include <stdio.h>
int main()
{
int n = 4;
int m = 5;
float f = 7.0f;
float g = 8.0f;
printf("%d\n", n, m); /* 参数太多 */
printf("%d %d %d\n", n);/* 参数太少 */
printf("%d %d\n", f, g);/* 值的类型不匹配 */
return 0;
}
3.10 escape.c
/* escape.c -- 使用转移序列 */
#include <stdio.h>
int main()
{
float salary;
printf("\aEnter your desired monthly salary:");
printf(" $_______\b\b\b\b\b\b\b");
scanf("%f", &salary);
printf("\n\t$%.2f a month is $%.2f a year.", salary,salary*12.0);
printf("\rGee!\n");
return 0;
}