目录
传送门下一节:C语言程序设计-算数运算符、赋值运算符、逗号运算符及表达式
1.4 常量与变量
C语言中的数据有常量与变量之分。
1.4.1 常量与变量的概念
【例1.5】 编写输出1000与50的和、1000的两倍的程序。
程序如下:
#include<stdio.h>
#define TMP 1000 //定义符号常量TMP
int main(void)
{
int s; //定义整型变量s
s=TMP+50; //相当于s=1000+50;
printf("First:%d\n",s);
s=2*TMP; //相当于s=2*1000;
printf("Second:%d\n",s);
return 0;
}
运行结果:
First:1050
Second:2000
程序说明:
1、程序中第二行的作用是用#define命令行定义符号名TMP,并用它代表1000。以后在本程序中出现的所有TMP都代表1000。如果在一个程序中经常使用同一个量,而且这个量较长,则用符号名代替此量比较方便,当然也有其他用处(如例5.1)。请注意#define命令行的定义形式和位置。
2、程序中TMP(代替1000)、50和2是固定不变的,而s中的值可以改变,执行语句“s=TMP+50;”后s得到两数之和1050,执行语句“s=2*TMP;”后,s的值又由1050变为2000.
以上例题中出现了两种量:一种是在程序运行过程中其值不能变的量,如50和2,这种量称为常量;TMP在程序运行过程中其值也不能改变,因此也是常量,这种用符号名表示的常量称为符号变量;另一种是在运行过程中其值可以改变的量,如s,这种量称为变量。注意,由于TMP是常量,企图通过语句“TMP=5;”给它赋一个新值是错误的。
每个变量都应该有一个名字,其名字由用户命名。变量的命名规则如下:
1、变量名由a~z、A~Z、0~9、_(下划线)组成,并区别大小写。
2、变量名的第一个字符不能是数字。
3、C语言中的关键字不能作为变量名。
其中C语言的关键字共有32个:
(关键字:系统预定说明的标识符称为关键字)
根据关键字的作用,可分为数据类型关键字、控制语句关键字、存储类型关键字、其他关键字。(此处借鉴于博主“阿强打代码”)
1、数据类型关键字(12个):
(1)char:声明字符型变量或函数
(2)double:声明双精度变量或函数
(3)enum:声明枚举类型
(4)float:声明浮点型变量或函数
(5)int:声明整型变量或函数
(6)long:声明长整型变量或函数
(7)short:声明短整型变量或函数
(8)signed:声明有符号类型变量或函数
(9)struct:声明结构体变量或函数
(10)union:声明共用体(联合)数据类型
(11)unsigned:声明无符号类型变量或函数
(12)void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
2、循环语句关键字(12个):
-1-循环语句
(1)for:循环语句,十分常用
(2)do:循环语句的循环体
(3)while:循环语句的循环条件
(4)continue:结束当前循环,开始下一轮循环
-2-条件语句
(1)if:条件语句
(2)else:条件语句否定分支(与if连用)
(3)goto:无条件跳转语句
-3-开关语句
(1)switch:用于开关语句
(2)case:开关语句分支
(3)default:开关语句中”其它“分支
-4-返回语句
return:子程序返回语句(参数可带可不带)
3、存储类型关键字(4个):
(1)auto:声明自动变量
(2)extern:声明变量是在其他文件正声明(也可以看作是引用变量)
(3)register:声明寄存器变量
(4)static:声明静态变量
4、其他关键字(4个):
(1)const:声明只读变量
(2)sizeof:计算数据类型长度
(3)typedef:用于给数据类型取别名(还有其他作用)
(4)volatile:说明变量在程序执行中可被隐含地改变
变量名是一个标识符。在C语言中,用来标识变量名、符号常量名、标号名、数组名、函数名、类型名、文件名等的有效字符序列称为标识符,这些标识符的命名规则与变量名的命名规则相同。标识符一般使用小写字母。
【例 1.6】下面变量名中哪些是合法的?哪些是不合法的?
Int、double、_123、9k、qbasic、printf、a.b、year、business
【解】合法的变量名有Int、_123、qbasic、printf、year、business
注意:printf也可作为变量名使用,在C语言中printf(库函数名)、define(预编译处理命令)等都有特定的含义,称为预定义标识符,它们不是关键字,C语法允许它们作为自定义标识符,但这样做将使它们失去系统规定的原意,例如,若将printf定义为变量名,系统就不能再通过printf调用输出函数。因此,我们不提倡将预定义标识符改为自定义标识符使用。
不合法的变量名有double(关键字)、9k(数字开头)、a.b(出现非法字符)。
说明:
(1)变量必须先定义后使用。变量就像一个可以存放“物品”的容器,定义的含义如同制造容器,通过定义的变量,系统就会为其分配一个存储单元。因此变量的定义部分必须放在本函数体内其他语句之前。
(2)应该注意:变量中存放的“物品”只能是数据,而且只能是一个数据。向变量中存放数据的操作称为赋值,只经定义而未赋值的变量,其值是不确定的。
可以给同一个变量多次赋值,每进行一次赋值操作,系统都会用新数据替代变量中的原有数据,因此变量的值应该是最后一次存放的数据。图1.8表示了一个变量的定义、多次赋值以及输出的全过程。
图1.8 变量的定义、赋值和输出
(3)变量的“名”和变量的“值”有区别。变量的“名”是该变量所代表的存储单元的标志,而变量的“值”是指存储单元中的内容。
1.4.2 整型常量与变量
整型常量不能带小数点。
1、整型常量
【例1.7】 编写程序,用%d格式说明符输出一个整型常量和实数,并观察其结果。
#include <stdio.h>
int main(void)
{
printf("%d,%d\n",21,21.5);
return 0;
}
运行结果:
21,0
程序说明:
格式说明符%d用于输出整型数据,所以21的输出结果是正确的,但21.5是实型数据,所以试图用%d输出,得到了错误的输出结果。
2、整型变量
整型变量中只能存放整型数据。整型变量的常用类型有基本型(int型)和长整型(long型)。定义变量时必须根据需要给出其类型。
【例1.8】编写一个整型变量的定义、赋值和输出的程序。
#include <stdio.h>
int main(void)
{
int a,b; //定义基本整型变量a和b
a=2147483647;
b=a+1;
printf("a=%d,b=%d\n",a,b);
return 0;
}
运行结果:
a=2147483647,b=-2147483648
(注:b的值不是2147483648,产生溢出现象)
程序说明:
(1)定义基本整型变量要用关键字int,%d用于输出基本整型数据。
(2)在Visual C++ 6.0环境中,基本整型占4个字节(32个位),取值范围是-2147483648~2147483647,因此2147483647+1的值产生溢出现象,得不到预期的值2147483648。
(3)程序中定义了变量a和b,其名称由编程者给出。在实际开发软件时,为了增加程序的可读性,命名变量时应做到变量名“简单明了”“见名知意”。例如,表示年份的变量名可用iYear,其中第一个字母i表示该变量的数据类型,Year表示年份。
3、变量初始化
在定义变量的同时给变量赋值,如“int a=5;”称为变量的初始化。“int a=5;”的作用与“int a;a=5;” 相同。C语言允许在同一定义部分中定义多个变量,并同时对它们进行初始化,如“int a=5,b=6;”是合法的。
由于只经定义而未赋值的变量,其值不确定,为了防止使用这些无意义的变量,建议对那些暂时不必赋值的变量均清零,如“int a=0;”。
为了防止产生数据溢出的现象,必须先估计所要处理的数据范围,再根据其范围选择合适的数据类别。整型变量可以精确地存放数据,但取值范围较小。当预计数据超出整型数据范围时,可以考虑选用实型变量。
1.4.3 实型常量与变量
1、实型常量
在C语言中将实型常量作为双精度类型处理。
【例1.9】编写程序,将实型常量按小数形式和指数形式输出。
#include <stdio.h>
int main(void)
{
printf("%lf\n",123451234512345.1);
printf("%le\n",12345.6788885);
printf("%le\n",0.0);
return 0;
}
运行结果:
123451234512345.090000
1.234568e+004
0.000000e+000
程序说明:
(1)实型常量有两种不同形式的输出,使用%lf按十进制小数形式输出,小数点后有6位;使用%le,按指数形式输出,小数点前有一位非零数字,小数点后输出6位;如果用%le格式说明符输出0.0,则输出形式为0.000000e+000。
(2)由第一个实型常量的输出结果可以看出,前15位的数字准确无误。
在C语言中实型常量有两种表示形式,即十进制小数形式和指数形式。
(1)十进制小数形式必须包括数字和小数点。如12.3、.12、12.、0.0都是合法的十进制小数形式,而123和.(只有小数点)是非法的小数形式。
(2)指数形式类似于数学中的科学记数法。如3.15e1、315e-1、0.315E+2分别相当于3.15*10、315*10的负一次方、0.135*10的二次方,而且都表示31.5.使用指数形式时,要注意e(或E)前面必须有数字,且e后面的指数必须为整数,如E-1、3e1.1、.3e、e等都是不合法的指数形式,而3.e2、1E+3都是合法的。
2、实型变量
实型变量中只能存放实型数据,实型变量按其所能保证的精度分为单精度型(float)和双精度型(double)。
【例1.10】编写一个实型变量的定义、赋值和输出的程序。
#include<stdio.h>
int main(void)
{
float a=12.3,b=0.0; //初始化两个单精度型变量
double c=12345.67; //初始化双精度型变量
b=12345.67;
printf("a=%f,b=%f,c=%lf\n",a,b,c);
return 0;
}
运行结果:
a=12.300000,b=12345.669922,c=12345.670000
程序说明:
(1)定义单精度型变量要用关键字float,%f用于输出单精度或双精度型数据;定义双精度型变量要用关键字double,%lf用于输出双精度型数据。不论用%f还是%lf,都输出6位小数。
(2)用单精度型变量存放数据时,能保证6位有效数字,而双精度型变量能保证15位有效数字。从运行结果可以看出,b保证了前6位数字(从第7位起数字已不准确),而c保证了所有数字(因为不大于15位)。
实型变量取值范围较大,但由于不能保证有效数字以外的数字,无法精确地存放数据,往往出现误差。表1.1列出了实型变量a的定义形式、a在Visual C++ 6.0环境中所占的字节数和a的取值范围。
表1.1 实型变量的定义
1.4.4 字符型常量与变量
1、字符型常量
【例1.11】编写程序,将字符按不同格式输出。
#include<stdio.h>
int main(void)
{
printf("%c---%d,%c---%d\n",'a','a','A','A');
printf("%d---%c,%d---%c\n",'a'+1,'a'+1,'A'+1,'A'+1);
printf("小写-大写字母=%d\n",'a'-'A');
return 0;
}
运行结果:
a---97,A---65
98---b,66---B
小写-大写字母=32
程序说明:
(1)格式说明%c用于输出一个字符,字符常量用单引号括起来,但输出时不输出单引号。字符也可以按整数形式输出,输出的是该字符的ASCII码值。字符a和A的ASCII码值分别为97和65。
(2)字符常量可以参加运算,表达式’a‘+1的值是字符a的ASCII码值97和1之和98(即b的ASCII码值),而’A‘+1的值是A的ASCII码值65和1之和66(即B的ASCII码值)。
(3)小写字母与其相对应的大写字母的ASCII码值之差都是32,因此字母H可表示为’h‘-32,字母m可表示为’M‘+32。
字符常量是ASCII字符集中的一个字符,但其中有些字符在键盘上是找不到的,例如各种特殊字符,这时可以使用转义字符形式,参见1.6.3节。
2、字符型变量
字符型变量(char)中存放ASCII字符集中的任何一个字符,字符变量在内存中占一个字节。
【例1.12】编写一个字符型变量的定义、赋值和输出程序。
#include<stdio.h>
int main(void)
{
char ch='a'; //初始化1个字符型变量
int s=0;
ch=ch-32; //将小写字母’a‘转换成大写字母’A‘
s='5'-'0'; //将数字字符5转换成对应数字5
printf("ch=%c,s=%d\n",ch,s);
return 0;
}
运行结果:
ch=A,s=5
程序说明:
(1)定义字符型变量要用关键字char,%c用于输出字符型数据。
(2)小写字母和对应大写字母的ASCII码值均相差32,用此规律可以进行字母的大小写转换。
(3)数字字符5和0的ASCII码值分别为53和48,其差值是5,正好是数字字符5对应的数字,用此规律可以进行数字字符和对应数字键=间的转换。
(4)编写程序时,定义字符型变量时建议用c作为变量名的第一个字符,表示该变量为字符型。
传送门来喽🚪~
传送门上一节:C语言程序设计-概述、简单程序、数据类型
传送门下一节:C语言程序设计-算数运算符、赋值运算符、逗号运算符及表达式
Patience is a virtue.