示例程序
#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:\n");
scanf("%f",&weight);
value = 1700.0 * 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;
}
结果:
本例使用了浮点数类型(float)的变量,以便处理更大范围的数据。float类型可以存储带小数的数字。
在printf()中使用%f来处理浮点值。%.2f中的.2用于精确控制输出,指定输出的浮点数只显示小数点后面两位。
scanf()函数用于读取键盘的输入。%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量。scanf()函数使用&符号表明找到weight变量的地点。
变量与常量数据
有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。
其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)。
数据:数据类型关键字
在C语言中,
用int关键字来表示基本的整数类型。后3个关键字(long、short和unsigned)和C90新增的signed用于提供基本整数类型的变式,例如unsigned short int和longlong int。
char关键字用于指定字母和其他字符(如,#、$、%和*)。另外,char类型也可以表示较小的整数。
float、double和long double表示带小数点的数。_Bool类型表示布尔值(true或false),_Complex和_Imaginary分别表示复数和虚数。
通过这些关键字创建的类型,按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。
位、字节和字
位、字节和字是描述计算机数据单元或存储单元的术语。这里主要指存储单元。
最小的存储单元是位(bit),可以存储0或1(或者说,位用于设置“开”或“关”)。
字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1字节均为8位。
既然1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。通过二进制编码(仅用0和1便可表示数字),便可表示0~255的整数或一组字符
字(word)是设计计算机时给定的自然存储单位。对于8位的微型计算机(如,最初的苹果机),1个字长只有8位。从那以后,个人计算机字长增至16位、32位,直到目前的64位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。
整数和浮点数
整数
和数学的概念一样,在C语言中,整数是没有小数部分的数。
浮点数
浮点数与数学中实数的概念差不多。
关键要理解浮点数和整数的存储方案不同。计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分。因此,虽然7.00和7在数值上相同,但是它们的存储方式不同。
C语言基本数据类型
int类型
int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依计算机系统而异。一般而言,存储一个int要占用一个机器字长。
早期的16位IBM PC兼容机使用16位来存储一个int值,其取值范围(即int值的取值范围)是-32768~32767。目前的个人计算机一般是32位,因此用32位存储一个int值。现在,个人计算机产业正逐步向着64位处理器发展,自然能存储更大的整数。
声明int变量
int a;
int b,c,d;
赋值
a=1;
初始化变量
初始化(initialize)变量就是为变量赋一个初始值。
int a=1;
int b=2,c=3;
简而言之,声明为变量创建和标记存储空间,并为其指定初始值
int类型常量
上面示例中出现的整数(1、2、3)都是整型常量或整型字面量。
打印int值
可以使用printf()函数打印int类型的值。
%d指明了在一行中打印整数的位置。%d称为转换说明,它指定了printf()应使用什么格式来显示一个值。格式化字符串中的每个%d都与待打印变量列表中相应的int值匹配。这个值可以是int类型的变量、int类型的常量或其他任何值为int类型的表达式。
#include <stdio.h>
int main()
{
int a=1;
printf("a=%d",a);
return 0;
}
显示八进制和十六进制
八进制显示数字,使用%o;以十六进制显示数字,使用%x。另外,要显示各进制数的前缀0、0x和0X,必须分别使用%#o、%#x、%#X。
#include <stdio.h>
int main()
{
int x=100;
printf("%d;%o;%x\n",x,x,x);
printf("%d;%#o;%#x\n",x,x,x);
}
其他整数类型
short 占用的存储空间可能比int类型少,常用于较小数值的场合以节省空间。
long int或long占用的存储空间可能比int多,适用于较大数值的场合。与int类似,long是有符号类型。
long long int或long long(C99标准加入)占用的存储空间可能比long多,适用于更大数值的场合。该类型至少占64位。与int类似,long long是有符号类型。
unsigned int或unsigned只用于非负值的场合。这种类型与有符号类型表示的范围不同。例如,16位unsignedint允许的取值范围是0~65535,而不是-32768~32767。用于表示正负号的位现在用于表示另一个二进制位,所以无符号整型可以表示更大的数。
在C90标准中,添加了unsigned long int或unsignedlong和unsigned short int或unsigned short类型。C99标准又添加了unsigned long long int或unsignedlong long。
声明其他整数类型
long int a;
long b;
short int c;
short d;
unsigned int e;
unsigned f;
unsigned long h;
unsigned short y;
long long j;
整数溢出
#include <stdio.h>
int main()
{
int i =2147483647;
unsigned int j=4294967295;
printf("%d %d %d\n",i,i+1,i+2);
printf("%u %u %u\n",j,j+1,j+2);
return 0;
}
可以把无符号整数j看作是汽车的里程表。当达到它能表示的最大值时,会重新从起始点开始。整数i也是类似的情况。它们主要的区别是,在超过最大值时,unsigned int类型的变量j从0开始;而int类型的变量i则从−2147483648开始。注意,当i超出(溢出)其相应类型所能表示的最大值时,系统并未通知用户。因此,在编程时必须自己注意这类问题。
打印unsigned int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明。如果系统中int和long的大小相同,使用%d就行。
char类型
char类型用于存储字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为char类型实际上存储的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。美国最常用的编码是ASCII编码,本书也使用此编码。
声明char类型变量
char a;
char b,c;
字符常量和初始化
char a='A';
打印字符
#include <stdio.h>
int main()
{
char a='C';
printf("%c\n",a);
printf("%d",a);
}
_Bool类型
C99标准添加了_Bool类型,用于表示布尔值,即逻辑值true和false。因为C语言用值1表示true,值0表示false,所以_Bool类型实际上也是一种整数类型。但原则上它仅占用1位存储空间,因为对0和1而言,1位的存储空间足够了。