-
变量与常量
每种基本类型的数据都具有常量和变量两种表现形式。
一.常量
C语言中的常量有以下四种:
- 整型常量
- 实型常量
- 字符型常量
- 字符串常量
1.整型常量
如:
12345,1314, 520
C语言的整型常量可以用八进制、十进制和十六进制3种形式来表示,采用不同的前缀加以区分:
0表示八进制,如0214。
0x/0X表示十六进制,如0x214、0X214。
不加任何前缀,默认为是十进制,如214。
在整型常量后添加后缀“L”或“l”,表示长整型数,如:100L、25L、0Xae5l等;
用后缀“U”或“u”表示无符号整数,如:22U、87u等。
ps:对于后缀的不同,影响的只是存储空间,对计算结果并无影响。如:100L+25L与100+25其结果在数学上没有区别。c语言中,并没有二进制,但所有进制都要转化成二进制来处理。
ps:程序中出现的某种进制的整型常量究竟属于哪种类型,可根据其值所在的范围来确定。
比如,常量123在short 类型的取值范围内,那
么其类型就为short型。
注意:整型常量的数字之间不允许嵌入空格、逗号或非数字字符,例如,以下是不合法的数字:
13 14
52,0
$1111
2.实型常量
(1)十进制数形式
包括符号“+”与“-”,0~9以及小数点“.”如:-520.、.520、13.14
(2)指数形式(科学记数法)
包括尾数、e(或E)以及指数。如13.14e2
注意:
①在e (或E)前后必须要有数字。
②e(或E)前面的尾数可以表示成整数或小数。
③ e(或E)后面的指数必须为整数。
ps:在C程序中,实型常量默认为是double型,但可以通过添加后缀”F/f”来表示该实型常量为float型,如3.14f、12e-4F。且在实型常量中不得出现任何空白符号.
3.字符常量
用单引号界定起来的一个普通字符或转义字符,如: ‘a'、‘A’、‘\n等。
普通字符可以是字符集中任意一个字符。普通字符常量的值就是该字符的ASCII值。
转义字符是一种特殊的字符常量,以反斜线“\”开头,后跟一个或几个字符,主要用来表示那些无法输出的控制字符或者特殊字符。
ps:
- 字符常量只能用单引号界定,不能用双引号或其他符号。
- 字符常量只能是单个字符,不能是非转义字符的若干字符序列。
- 数字被定义为字符型之后,其数值就发生了改变。如4和’4’代表不同的量,'4’是字符常量,而4是整型常量。
4.字符串常量
用一对双引号括起来的一个字符序列,如:"Hello "、“a"、“”、"$13.14”等。
存储:系统自动在字符串常量后面加上“\0”作为字符串结束标志。
如字符串”china”在内存的存储情况为:
“\0”是一个ASCII值为0的不可显示字符,不引起任何控制操作。
字符常量与字符串常量的区别?
(1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;
(2)长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数;
(3)存储形式不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效字符的ASCII码值外,还要存储一个结束标志\0’。
ps:常量又分为字面常量(直接常量)和符号常量。
字面常量从其字面即可判断其值。
符号常量使用专门的符号来代表一个常量。
符号常量用于定义具有如下特点的数据:
- >在程序中保持不变。
- >在程序内部频繁使用。
- >需要用比较简单的方式替代某些值。
二.变量
在程序运行过程中其值可以改变的量。
作用:存储数据
程序设计使用变量来表达数据的存储。一个变量在内存中占据一定的存储单元,在该存储单元中存放变量的值。使用变量名可以引引用存储在内存中的数据,并随时根据需要显示数据或者执行数据操作。
本质:变量代表内存中具有特定属性的存储单元,变量名实际是符号化的内存地址。
1.变量的定义
在C语言中,要求对所用到的变量使用前必须先强制定义,即:先定义,后使用。
注意:
- 多个变量名之间用逗号进行分隔,数据类型和变量名之间至少用一个空格进行间隔。
- 变量的定义语句通常放在函数体的开始部分,变量定义语句的位置直接影响变量的作用域。
- 若变量定义语句放在函数体内,则要集中放在函数的开始,不能与其他语句混放,否则不能通过编译。
- C程序的每个变量都有固定的类型,不允许在程序的同一处将同一变量定义为不同类型。
ps:
通常把下划线开始的标识符留给系统使用,故在编写普通程序时,应尽量避免使用该形式的标识符。
2.变量的赋值
变量名=表达式
如,love=520,表示把520赋给变量love。进行这个赋值操作后,无论love原来的值是什么,它所保存的数值就变成520。
要求:
- 给变量赋值应注意所赋值与被赋值变量的类型匹配问题。对于类型不一致的情况,C语言规定:在允许转换的情况下,所赋值将自动转换为被赋值变量的类型,然后再赋值,如果不能转换就是类型错误。
- 可以给同一个变量多次赋值,每进行一次赋值操作,系统都会用新数据代替变量中的原有数据,故变量的值是最后一次存放的值。
3.变量的初始化
在定义一个变量的同时赋给它初值。
如 int a=1,b=2;
注意:
- 可以对被定义的部分变量初始化。如,int a=1,b=2,c;
- 如果对几个变量初始化为同一个值,应写成:int a=5,b=5,c=5;不能写成:int a=b=c=5;
- 变量不一定要进行初始化,但使用变量之前应该赋给变量一个确定的值。
4.变量、变量名、变量类型、变量值、给变量赋值之间的关系
- 变量——杯
- 变量名——杯子的号码
- 变量类型——所装的材料名称
- 变量值——所装的东西多少
- 给变量赋值——把某材料倒进杯子
5.思考探究
1.输出实(浮点)型变量的值。
原因:
a是单精度浮点型,最多有7位有效位数,整数已占4位,故小数部分3位之后的均为无效数字。
b是双精度浮点型,有效位最多为16位,但“%f”默
认小数位数保留6位,其余部分四舍五入。
由此题,我们可以获得一些经验:由于实型变量是由有限的存储单元组成的,故能提供的有效数字总是有限的,其有效位以外的数字将被舍去,由此可能会产生一些误差。
由于实数存在舍入误差,使用时应注意:
- 不要试图用一个实数精确表示一个大整数,实数是不精确的。
- 实型数据一般不判相等,而是判接近或近似。
- 避免直接将一个很大的实数与一个很小的实数进行加减运算,否则会丢失“小数据”。
代码如下:
#include <stdio.h>
void main()
{
float a;
double b;
a=6666.666666;
b=6666.6666666666666666;
printf("a=%f\nb=%f",a,b);
}
可以自行测试,感受一下。
2.字符变量的定义与使用。
由此例可知:
在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整型数据之间可以通用。即一个字符数据既可以字符形式输出,也可以整数形式输出。输出形式取决于函数printf()格式串中的格式符,当格式符为"%c"时,对应输出的变量值为字符,当格式符为"%d" 时,对应输出的变量值为整数。
代码如下:
#include <stdio.h>
void main()
{
char a,b;
a='a';
b='b';
printf("a=%c b=%c\n",a,b);
printf("a=%d b=%d",a,b);
}
ps:C语言允许字符数据与整数相互赋值,还可以直接进行算术运算。由于字符型数据占1个字节,所以整型变量与字符型数据运算时,只有低字节参与运算。(具体途径,整型提升那篇详细说明了。)
3.数据溢出
应注意,字符数据只占一个字节,放0~255范围内的整数。
为什么会出现这种情况呢?
C语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值,就会产生数值溢出,得到一个不正确的结果。(计算机是怎么得出这个错误结果的,在隐式类型转换那篇中的整型提升部分已经详细讲解了,这里不在赘述)