C语言的语法基础
2.变量
在程序执行过程中,可以改变值的量称为变量。变量有以下几个特征:变量名、变量值、变量的数据类型、变量的地址、变量的存储类别、变量的作用域以及变量的生存期等。变量名是指按照C语言标识符的规则,给变量取的名称,使用变量名就可以存取变量的值。一个变量在内存中占有一定的存储空间,这个存储空间内所存放的数据就是变量的值。变量的数据类型确定了该变量的性质、取值范围、占内存空间大小以及所能参加运算的方式。有关变量地址的概念我们将在下一节讨论。在第六章讲述变量的存储类别、变量的作用域以及变量的生存期等。
在C语言中变量必须先定义才能使用。变量一经定义数据类型,计算机系统就会给该变量分配相应的存储空间,以便存放数值。一条变量定义语句由数据类型,其后跟一个或多个变量名组成。变量定义的格式如下:
数据类型关键字 <变量名表>;
变量名表是一个或多个标识符,每个标识符之间用逗号“,”分开。例如:
int i, j, k;
上述语句定义了三个变量,它们的名字分别为i、j、k,数据类型为整型,它们可以存取整型数据,变量的取值范围是-32768~32767,占内存空间2个字节,可参于算术运算、位运算等。
表2.5给出了Turbo C 2.0 基本数据类型关键字,还给出了在IBM PC系列微机上相应数据类型所对应的变量占存储空间大小以及变量的取值范围。
表2.5 Turbo C 2.0 基本数据类型关键字、变量占内存字节数及变量取值范围
数据类型关键字 |
占内存字节数 |
取值范围 |
说 明 |
int |
2 |
-32768~32767 |
整型 |
short int |
2 |
-32768~32767 |
短整型 |
long int |
4 |
-2147483648~2147483647 |
长整型 |
unsigned int |
2 |
0~65535 |
无符号整型 |
unsigned short int |
2 |
0~65535 |
无符号短整型 |
unsigned long int |
4 |
0~4294967295 |
无符号长整型 |
char |
1 |
-128~127 |
字符型 |
unsigned char |
1 |
0~255 |
无符号字符型 |
float |
4 |
3.4×10-38~3.4×1038 |
7~8位有效数字
单精度实型
double
8
1.7×10-308~1.7×10308
15~16位有效数字
双精度实型
long double
10
3.4×10-4932~1.1×104932
19~20位有效数字
长双精度实型
表2.5中long int 可简写为long,short int 可简写为short,unsigned int 可简写为 unsigned。表2.5列出的是IBM PC系列微机上基本数据类型所占内存字节数及数据的取值范围,不同类型的机型表中数据有所不同,使用时可查阅相关手册。本书的叙述、举例均按表2.5中的数据为标准。下面我们举例说明如何定义变量:
int i, sum; 定义i,sum为整型变量
long k, suml; 定义k,suml为长整型变量
double x, y ; 定义x,y为双精度实型变量
float x1, x2; 定义x1,x2为单精度实型变量
char ch; 定义ch为字符型变量
unsigned u; 定义u为无符号整型变量
3.变量的初始化:
定义变量时,在变量之后加“=常量”,则对该变量进行了初始化。变量初始化过程是在定义变量类型时,把“=”号左边的常量赋值给该变量。例如:
int i=0, j=0;
上述语句定义i, j为整型变量,并把常量0赋给i变量与变量j,这一初始化过程是在程序执行到本函数时给变量赋初值的。除了第六章讲述的静态存储变量和外部变量的初始化是在编译阶段完成的之外,动态变量的初始化过程都是在执行时完成。因此,语句int i=0, j=0; 等价于以下两条语句
int i, j;
i=j=0; /*运行时赋初值,把0值赋值给变量i和变量j */
注意,若写成 int i=j=0;是非法语句。
一个动态变量未经初始化、也对其未赋值,其初值是不确定的。例如在某函数中有以下程序段:
int i;
printf("%d\n", i);
执行后输出结果是个不确定的整数值。
静态存储变量和外部变量若未经初始化、也对其未赋值,其初值是确定的,通常是0值,详见第六章。
2.1.3内存的概念
计算机内存是由一片连续的存储单元组成,操作系统给每个单元一个编号,这个编号称为内存单元的地址(简称地址)。地址(编号)通常由一组连续的整数组成,编号小的称内存低地址,编号大的称内存高地址。每个单元占1个字节(byte)大小,这样内存中每一个字节就有一个地址(编号)。计算机在执行程序时先要做一系列的工作,例如要把程序的机器指令、常量等装入内存,在内存中为程序的变量分配存储空间等等。然后才完成程序设计预定的任务。
常量、变量在内存的存储情况经常用如图2.2(a)和图2.2(b)的形式表示,设在某程序中有以下定义变量的语句:
int i=25, j=0x1af, k=-25;
long int s=-25;
系统将在内存中为变量i,j,k各分配2个字节的连续存储单元,变量s分配4个字节的连续存储单元,并把相应的常量存储到该变量的地址所指的空间中。
设变量i分配到地址为3000、3001的2个连续存储单元,则这两个单元将存放常量25;
设变量j分配到地址为3002、3003的2个连续存储单元,则这两个单元将存放常量0x1af;
设变量k分配到地址为3004、3005的2个连续存储单元,则这两个单元将存放常量-25;
设变量s分配到地址为3006到3009的4个连续存储单元,则这四个单元将存放常量-25;
如图2.2(a)所示,描述了变量i, j, k, s在内存中存储空间分配情况。
1个字节占二进制8位(bit),有符号整数在内存中采用补码表示方法(详见附录B),有符号数的最高位表示符号位,符号位为0表示正数,符号位为1表示负数。补码表示方法中正数用二进制原码表示,负数则用补码表示。上述语句中整型int 类型25的二进制表示为0000 0000 0001 1001, 其补码(按位取反,未位加1)是 :1111 1111 1110 0111。长整型long int 类型25的二进制补码是 1111 1111 1111 1111 1111 1111 1110 0111。如图2.2(b)所示,描述了变量i,j,k,s的值在内存中按位表示情况。
无符号整数表示的都是正数,其最高位不是符号位,而是数据本身的一部分。假设内存中有一个二进制数据1111 1111 1110 0111,我们把它视为有符号整数int 类型,则值为-25, 若把它视为有无符号整数unsigned 类型,则值为十六进制数0xffe7(即十进制数65511)。因此,内存中同一个数据,若将其视为不同的数据类型,其表现形式也不相同。
内存高地址 内存低地址
3009 3008 3007 3006 3005 3004 3003 3002 3001 3000
-25 |
-25 |
0x1af |
25 |
变量s占4字节 变量k占2字节 变量j占2字节 变量i占2字节
图2.2 (a) 变量在内存中分配的存储空间
内存高地址 内存低地址
00000000 00011001 变量i占2字节,值为25
11111111 11100111 变量j占2字节,值为-25
00000001 10101111 变量k占2字节,值为0x1af
11111111 11111111 11111111 11100111 变量s占4字节,值为-25
图2.2 (b) 变量的值在内存中按位表示
将一个字符型常量赋值给字符变量,并不把字符本身存到内存单元中,而是将该字符常量的ASCII码存储到内存单元中。例如字母'A'的ASCII码是0x41(十进制数65),若有语句 char ch='A'; 则变量ch在内存中按位的表示如图2.3所示。
01000001 |
图2.3字符变量ch在内存按位表示,ch占内存1字节
假设内存中有一个二进制数据01000001,我们把它视为字符类型则值为'A',若把它视为int类型,则值为65。例如在输出该数据时用printf("%c,%d\n",ch,ch);则输出A,65。格式输出函数printf将在下一节介绍。
2.2 基本输入、输出函数
程序中通常应包含输入数据、处理数据和输出结果三个基本要素(见[例1.1]与[例1.2])。对于微型计算机来说,常见的输入设备有键盘、鼠标、扫描仪、数字化仪等,常见的输出设备有显示器、打印机、绘图仪等。程序设计中可以从磁盘文件输入数据,也可以将数据输出到磁盘文件,因此磁盘文件是即可输入也可输出的设备。在学习程序设计入门阶段,先学习由键盘输入数据(通常指定键盘为标准输入设备),并把数据输出到屏幕(通常指定屏幕为标准输出设备)。在第八章中我们再介绍读写磁盘文件中的数据。
C语言没有提供输入、输出操作的语句。C语言程序中的输入和输出完全依靠调用C语言的标准输入、输出函数来完成。Turbo C2.0 库函数提供了格式化输入、输出函数和非格式化输入、输出函数。
发表评论