变量
一,变量
1,变量的本质: 变量代表一个有名字的、具有特定属性的一个存储单元,它用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。变量必须先定义,后使用。在定义时需要指定该变量的名字和类型(类型会决定变量的存储空间大小),变量名可以理解为虚拟的地址,变量地址可以理解为系统为该变量在计算机内存里面开辟的存储单元的地址(实际的地址)。
2,变量的定义格式(注意格式)
格式1: 数据类型 变量名1,变量名2 (同时定义,a和b为int型变量)
int a , b;
格式2: 数据类型 变量名 (分批定义,a,b为int型变量)
int a ;
int b;
3,对变量的基本操作(赋值和取值)
!----将数据(值)存入变量中,这个操作称为赋值。如a=4 (以a为研究对象叫赋值)
@----取得变量里当时保存的值,在计算过程中使用,这一操作称为取值。如b=a+2(以a为研究对象取值)
二,变量的命名(标识符)
1 ,定义: 在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符 ( identifier)
2,命名规则:字母、数字和下划线3种字符组成,且第1个字符必须为字母或下划线。
3,命名规则的注意点:
!-----变量的命名区分大小写:如 Name和 name 是两个不同的变量名,一般程序中的变量名用小写字母表示。
@----C语言的保留关键字不可以作为标识符:
#----变量名的长度是有限的:过去有的 C 语言系统只允许变量名包含 8 个字符,现在使用的 C 语言编译系统都允许变量名的长度为 32 个字符或更多的。
¥----在同一个作用域内,不要定义同名的两个变量。
&-----尽量避免定义与库函数名同名的变量,如printf.scan等,虽然不会出现语法错误,但容易造成混淆
4,变量名的有关扩展点:
1 当定义一个变量printf时,在使用printf函数功能去执行对应的操作的时候会报错,因为c编译器认为printf为不合法的函数,因为c编译器利用的是就近原则。
三,常变量
1,定义 : const int a=3;
2,表示a被定义为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变
3,常变量和常量的主要区别
!----定义符号常量:无名字的不变量
@----定义常变量:类型和名字和数值不变,有名字的不变量
¥----- 常量不进行内存分配,在预编译时就符号常量会被全部替换,而变量会进行内存分配。
四,整型变量
1,整型数据常见的存储空间和值的范围
2,sizeof关键字(sizeot是C语言中的关键字,不是函数名)
!----sizeof()的作用:是C语言提供的专门用于测量类型或变量长度的运算符。
@---sizeof关键字的用法:sizeof(类型名)或 sizeof(变量名),如下
printf("%d,%d,%dn" ,sizeof(int),sizeof(short),sizeof(long)) //即可准确计算出基本整型int、短整型short、长整型数据long,所占内存空间的字节数。
&----C标准并未规定各种不同的整型数据在内存中所占的字节数,只要求 long 型数据长度不短于 intashort 型数据长度不长于 int 型。即
sizeof ( short ) 小于等于 sizeof ( int ) 小于等于 sizeof ( long ) 小于等于 sizeof ( long long)
3,关于“溢出“(钟表原理)
#include <stdio.h>
void main()
[
int a,b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);
]@333333333333333333333333333333333333333333333333
输出结果为:32767,-32768。显然b出现了溢出现象
4,无符号类型,unsigned
!----存在价值:在实际应用中,有的数据的范围常常只有正值(如学号、年龄、库存量等)。为了充分利用变量的值的范围,可以将变量定义为“无符号”类型,即不用整型变量存储单元中的第 1位表示符号,把全部二进制位都用来存放数值,此时存放的数值是无符号的。在类型名前面加上修饰符 unsigned,表示指定该变量是“无符号整数“类型。
@----命令格式:unsigned 数据类型 变量名
&----使用unsigned 注意点:
若未特殊说明,则默认为有符号类型
非整型数据不可用signed和unsigned修饰符说明,如实型数据。只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据则不能。
对无符号整型数据用“%u”格式来进行输出。%u 表示用无符号十进制数的格式输出
在将一个变量定义为无符号整型后,不应对其赋予一个负值,否则会得到错误的结果,如 unsigned short price = - 1;(报错) // 不能把一个负整数存储在无符号变量中
#---实际操作:
unsigned short price = 50;// 定义 price 为无符号短整型变量
printf ( %u\n”, price )
5,实形变量
!----实形变量的分类:浮点数类型包括 float(单精度浮点型,有4个字节的),double(双精度浮点型,有8个字节的),long double(长双精度浮点型,有8个字节的)
@----实形变量在内存里面的存储方式:以规范化的指数形式存在内存当中的,小数部分为精度,指数部分代表范围。(注:下面的10进制都是要为二进制01表示的)
¥----实型数据的舍人误差
1 由于实型变量在内存中的存储单元是由有限个字节组成的,能提供的数字也是有限的,在有效的数以外的数字将被舍去,因此可能会产生误差。
2 例如,执行语句:
floata=1212.5141926;
printf("a=%f\n",a);
在对上述语句进行编译时,对 float 型变量分配 4 个字节,但对于浮点型常量 1212.1415926 按双精度处理,需要分配8个字节。编译系统会发出“警告”,提醒用户注意这种转换可能损失精度。这样的“警告”一般不会影响程序运行结果的正确性,但会影响程序运行结果的精确度。
一般情况下,可以在常量的末尾加专用字符,强制指定常量的类型。如在 1212.141602 后面加字母 F或f;就表示是 float 型常量,分配 4个字节,当c程序读到这个位置时,将会自动的将其转换为f区间的了
float a-1212.141602; //把 1212.141602 按单精度浮点常量处理,编译时不出现“警告”,但是任然是不精确的数值。
3 注:在 C 语言中进行浮点数的算术运算时,将 float 型数据都自动转换为 double 型,然后进行运算
6,字符变量
!-----定义一个变量,用来存放字符常量,占用一个字节,存放一个字符,只能存放一个字符。
@----用类型符 char 定义,定义形式为:char c1,c2; c1= 'a'; c2= 'b';或c1=97; c2=98(因为在大于等于0小于等于255的范围内,是可以互通的)
#-----int a=65; char c='A'的在内存里的存储异同点:字符变量和整型变量在内存存放形式相似,区别是整型变量占2个字节,字符型变量占1个字节。所以大于等于0小于等于255的整型数据可以和字符型数据通用。
因为,2个字节 ,16个bit,第一个bit 255
1111111, lllllllllll。
1个字节 ,8个bit,第一个bit 255
1111111。
以下就是,所以大于等于0小于等于255的整型数据可以和字符型数据通用。的典型运用。
%----字符变量的输出(如上图):以字符或整数形式输出,输出形式取决于printf函数中的格式符,格式符为“%c”时输出的变量值为字符,格式符为“%d"时输出的变量值为整数