C Primer Plus (第6版)中文版第3章
学习内容:
1.关键字——int、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary;
2.运算符——sizeof();
3.函数——scanf();
4.整数类型和浮点数类型的区别;
5.如何书写整型和浮点型常数,如何声明这些类型的变量;
6.如何使用printf()和scanf()函数读写不同类型的值。
程序离不开数据。把数字、字母和文字输入计算机,就是希望它利用这些数据完成某些任务。例如,需要计算一份利息或显示一份葡萄酒商的排序列表。这就需要学习如何读取数据,还要学习如何操控数据。
C语言提供两大系列的多种数据类型。这里先学习两大数据类型:整数类型和浮点数类型。
从一个简单的C程序示例开始
platinum.c程序
#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);
/*
假设白金的价格是每盎司$1700
14.5833 用于把英磅常衡盎司转换为金衡盎司
*/
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变量的地点。
常量:有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化。
变量:有些数据类型在程序运行期间可能会改变或被赋值。
C语言的基本类型关键字
见下表:
在C语言中,用int关键字来表示基本的整数类型。long、short、unsigned及signed用于提供基本整数类型的变式,例如 unsigned short int 和 long long int。char关键字用于指定字母和其他字符(如,#、$、%和*)。另外,char类型也可以表示较小的整数。float、double和long double表示带小数点的数。_Bool类型表示布尔值(turtle或false),_Complex和_Imaginary分别表示复数和虚数。
通过这些关键字创建的类型,按计算机的存储方式可分为两大基本类型:整数类型和浮点数类型。
位、字节和字
位、字节和字是描述计算机数据单元或存储单元的术语。这里主要指存储单元。
最小的存储单元是位(bit),可以存储0或1(或者说,位用于设置“开”或“关”)。虽然1位存储的信息有限,但是计算机中位的数量十分庞大。位是计算机内存的基本构建块。
字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1字节均为8位。这时字节的标准定义,至少在衡量存储单位时是这样的。既然1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。通过二进制编码(仅用0和1便可表示数字),便可表示0~255的整数或一组字符。
字(word)是设计计算机时给定的自然存储单位。对于8位的微型计算机,1个字只有8位。从那以后,个人计算机字长增至16位,32位,直到目前的64位。计算机的字长越长,其数据转移越快,允许的内存访问也更多。
整数和浮点数
整数
“整数”和咱们之前理解的整数概念是一样的,整数是没有小数部分的数。计算机以二进制数字存储整数,例如,整数7以二进制写是111.因此,要在8位字节中存储该数字,需要把前5位都设置成0,后3位设置成1.
浮点数
浮点数与数学中的实数概念差不多。2.75、3.16E7、7.00和2e-8都是浮点数。注意,在一个值后面加上一个小数点,该值就成为一个浮点值。所以,7是整数,7.00是浮点数。显然,书写浮点数有多种形式。
e记数法:3.16E7表示.7被称为10的指数。
浮点数与整数的存储方案不同,计算机把浮点数分成小数部分和指数部分来表示,而且分开存储这两部分。因此,虽然7.00和7在数值上相同,但是它们的存储方式不同。在十进制下,可以把7.0写成0.7E1,这里,0.7是小数,1是指数。当然,计算机在内部使用二进制和2的幂进行存储,而不是10的幂。
这两种类型的不同:
· 整数没有小数部分,浮点数有小数部分。
· 浮点数可以表示的范围比整数大。
· 对于一些算术运算(如,两个很大的数相减),浮点数损失的精度更多。
· 因为在任何区间内都存在着无穷多个实数,所以计算机的浮点数不能表示区间内所有的值。浮点数通常只有实际值的近似值。例如,7.0可能被存储位浮点值6.99999.
· 过去,浮点运算比整数运算慢。不过,现在许多CPU都包含浮点处理器,缩小了速度上的差距。
C语言基本数据类型
int型
C语言中的整数类型可表示不同的取值范围和正负值。一般情况使用int类型即可,但是为满足特定任务和机器的要求,还可以选择其他类型。
int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依计算机系统而异。一般而言,存储一个int要占用一个机器字长。
声明int变量时要先写上int,然后写上变量名,最后加上一个分号。如果要声明多个变量,可以单独声明每个变量,也可在int后面列出多个变量名,变量名之间用逗号分隔。
int erns;
int dogs, cows, goats;
初始化变量就是为变量赋一个初始值。在C语言中,初始化可以直接在声明中完成。只需在变量名后面加上赋值运算符(=)和待赋给变量的值即可。如下所示:
int hogs = 21;
int cows = 32, goats = 12;
简而言之,声明为变量创建和标记存储空间,并为其指定初始值。
打印int值:可以使用printf()函数打印int类型的值,%d可以指明在一行中打印整数的位置。%d称为转换说明,它指定了printf()应使用什么格式来显示一个值。格式化字符串中的每个%d都与待打印变量列表中相应的int值匹配。这个值可以是int类型的变量、int类型的常量或其他任何值为int类型的表达式。
使用字符:char类型
char类型用于存储字符,但是从技术层面看,char是整数类型。因为,char类型实际上存储的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。标准ASCII码的范围是0~127,只需7位二进制数即可表示。通常, char类型被定义为8位的存储单元,因此容纳标准ASCII码绰绰有余。一般而言,C语言会保证char类型足够大,以存储系统(实现C语言的系统)的基本字符集。
C语言把1字节定义为char类型占用的位(bit)数,因此无论是16位还是32位系统,都可以使用char类型。
1.声明char类型变量
char类型变量的声明方式与其他类型变量的声明方式相同。例如,
char res;
char itable, latan;
以上声明创建了3个char类型的变量:res、itable和latan。
2.字符常量和初始化
如果要把一个字符常量初始化位字母A,不必背下ASCII码,用计算机语言很容易做到。通过初始化把字母A赋值给grade即可:
char grade = 'A';
在C语言中,用单引号括起来的单个字符被称为字符常量。编译器一旦发现'A',就会将其转换成相应的代码值。单引号必不可少。不可是双引号!
实际上,字符是以数值形式存储的,所以也可使用数字代码值来赋值。
3.非打印字符
单引号只适应于字符、数字和标点符号。
一些转义序列如下表
4.打印字符
printf()函数用%c指明待打印的字符。一个字符变量实际上被存储为1字节的整数值。因此,如果用%d转换说明打印char类型变量的值,打印的是一个整数。而%c转换说明告诉printf()打印该整数值对应的字符。
charcode.c程序
#include <stdio.h>
int main(void)
{
char ch;
printf("Please enter a character:\n");
scanf("%c",&ch);
printf("The code for %c is %d.\n",ch, ch);
return 0;
}
输出结果:
scanf()函数会读取用户输入的字符,&字符表示把输入的字符赋给变量ch。接着,printf()函数打印ch的值两次,第1次打印一个字符(%c),第2次打印一个十进制整数值(%d)。注意,printf()函数中的转换说明决定了数据的显示方式,而不是数据的存储方式。