1、标识符
什么事标识符呢?变量的名字就是标识符。不仅限于变量名,程序中各种元素的名字,都属于标识符。例如符号常量名、函数名、数组名、类型名等。关键字也叫保留字。属于关键字的词已被系统“注册”了,特殊用途,我们在为程序中的各种元素命名时是坚决不能使用这些关键字的。
C语言中的系统函数名如求正弦的函数名sin、求算术平方根的函数名sqrt、用于输出的函数名printf等,不属于关键字,称为预定义标识符。可以用预定义标识符为变量命名,语法上是可以的,但是我们应尽量不要那样做。如果为一个变量命名为sin,显然是在制造混乱:sin究竟是指变量还是指系统函数呢?
除关键字、预定义标识符的这些词之外,我们为程序元素命名的其他的名字如a、b等,成用户标识符。
用户标识符的规则:只能由英文字母、数字、下划线三种符号组成。字母区分大小写。首字母不能为数字,可以为英文字母或下划线。不能使用关键字。
2、常量
直接写在程序里的数据值,就是常量。例如a=10;10就是常量。b=2+3;2、3也是常量。而a、b不是常量是变量。
常量的概念不止限于数字型,直接写在程序中的文字型的数据值也是常量,例如‘b’、“Hello”等。文字型常量要用引号硬起来,有两种类型,分别称为字符常量和字符串常量。
还有一种常量是用符号代替的,称为符号常量。符号常量需用#define命令定义:#define PI 3.14;表示定义PI是3.14的代替符号,PI是3.14的代号,PI就是3.14(不是变量PI的值是3.14)。3.14是常量,故PI也是常量。
在程序运行过程中这些值不会变化,故称为常量。
3、变量
在程序中,变量实际代表的是计算机内存中的一块存储空间,存储空间的名称就是变量名,其中存储的内容就是变量的值。变量必须先定义然后才能使用。举例:int a;是定义变量,它表示让计算机先准备好变量a这个盒子,实际是让计算机在内存中分配和划定变量a的存储空间。在程序中,我们可以随时将新值保存在变量中。当新值保存在变量中时,变量原有的值同时被覆盖不复存在;因为一个变量在某一时刻只能保存一个值。
注意:定义变量后在为它赋值前,变量的值不是“空白”,而是随机数。
在定义时为变量赋初值也称对变量的初始化。举例:int sum=0;int price=9,height=10;int size=num+4;size的值为4,可用表达式为变量赋初值。
在定义中不允许连续赋初值。举例:int x=y=z=5;错误。而只能写为:int x=5,y=5,z=5;
4、数据类型
整型数据
数值型数据分整数和实数,整数是不带有小数点的,而实数必须带有小数点。
(1)整型常量的表示
整型常量就是直接写在程序里的整数,如语句a=10;10就是整型常量。这种直接写出的整数都是十进制的,在c语言中还允许将整数写为八进制或十六进制。
写为十进制:直接写,与生活中的写法一致。
写为八进制:在整数前加0。例如a=012;注意:生活中在整数前加0是没有任何作用的,但在c语言中,整数前加0与不加0完全不同,加了0就是八进制。例子中012是八进制的12。
写为十六进制:在整数前加0x或0X。a=0xA。x、A大小写均可,如a=0Xa;a=0XA;
在C语言中不允许将数据写为二进制。
整型数据如何在计算机中存储:计算机的内存只能存储0或1,整数要被转换为二进制存储,占2个或4个字节。
注意:整数在计算机中存储,除要转换为二进制外,还要转换为补码。将整数字节转换为二进制的形式称为原码。正数的补码和原码相同;负数的补码为该数绝对值的二进制形式按位取反。(即1变为0,0变为1)后在加1.对于有符号数,二进制的最高位(最左边一位)为符号位;负数为1正数为0.采用补码可以将减法运算变作加法实现。
《整数补码
求给定数值的补码分以下两种情况:
正数
【例1】+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数
求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1[2]。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
【例2】求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。
【例3】数0的补码表示是唯一的。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000
转化为原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
【例4】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。》
整型变量的类型:int a;a=2.8;a将被赋值为2(无四舍五入)
基本型整型变量:整型变量是专门用于保存整数的变量,且只能保存整数,不能保存实数。由int 定义的变量称为基本型的整型变量。它的空间的大小由编译系统决定。在vc++6.0中,占4字节;在其他某些编译系统中,占2字节。整型变量的空间大小是预先由编译系统规定的,与变量值无关。int a;无论a的值为1还是20000,在vc++6.0系统中均占4字节。
其他类型的整型变量:无论向谁询问,只要明确了是什么规格的包,则必然能得到确定的回答,例如问“旅行包多大?”或“女式的包多大?”。在汉语中,“旅行”“女士的”是“包”的修饰语。在c语言中,也可为int添加修饰语,已明确指出整型变量的规格。int的修饰语有以下4个:short:表示变量为短整型,即确定占2个字节的整型变量。long:表示变量为长整型,即确定占4个字节的整型变量。signed:表示变量为有符号型,即可以保存负数的整型变量。unsigned:表示变量为无符号型,即可以保存正数和0,但不能保存负数的整型变量。
以上修饰语在定义整型变量时可选用0~多个,已定义不同规格的整型变量;但short和long不能同时选用,signed和unsigned不能同时选用。当既不用short也不用long时,视为基本型,其空间大小由编译系统决定;当既不用singed也不用unsigned时,视同signed,即有符号型。举例:signed short int a;如果使用了修饰词,int可以省略signed short a;
占2字节的有符号短整型变量取值范围为-32768~32767,无符号的就为0~65535,能保存的最大值比相应有符号数扩大一倍;占4字节的整型变量也是如此(范围最大分别是~+21亿、~+42亿)。这是因为原来表示负数的空间在无符号变量中也用于表示正数了。
实型数据
实型也称浮点型,就是带有小数点的数值型数据。
(1)实型常量
实型常量也称实数或浮点数,在c语言中只能写为十进制,不能写为其他进制。但十进制的实型常量又可写为两种形式:小数形式、指数形式。
小数形式:在程序中小数额写法与生活中的写法类似,例如:3.14159 0.158 0.0 -18.0 12. .36 整数部分为0时0可以省略,如0.36可写为.36。小数部分末尾的0也可省略,如12.0可写作12.。
注意:小数点是不能省略的,对于无小数位的实数也必须有小数点。如实数12.0写作12是不行的,因为12是整数就不是实数了。
指数形式:
以科学计数法表示的实数如2.1*10^5,在C语言中用e(或E)表示“*10”,对于2.1*10^5,在程序中应写作2.1E5或2.1e5。举例:-2.8e-2表示-2.8*10^-2。
注意:e或E前后的内容都不能省略。对E(或e)前的小数范围没有要求,但规定E(或e)后必须是整数不能是小数。aen(或aEn)是一个整体,表示一个数,相当于英语中的一个单词,中间是不能随便加空格的。
(2)实型变量
如何定义实型变量?实型变量有两种规格:一种为单精度实型,一种为双精度实型。双精度型的能表示的数值范围相对更、精度更高。
单精度型:单精度型的变量用关键字float定义,这种变量占4个字节,有效数字6位(有效数字是指从第一个不是0的数值起的数据位数,不一定是6位小数),表示范围+(-)10^38。举例:float f=0.001234567;float f=0.00123456789;/*有效数字过多将被阶段,f实际值为0.001234568*/
双精度:双精度的变量用关键字double定义,这种变量占8个字节,有效数字15位,表示范围+(-)10^308。
实型数据也是被转换为二进制后存储,但首先要转换为“小数*2^指数”的形式,然后将小数部分和指数部分分别转换为二进制,在分别存储小数部分和指数部分。这与整型数据的存储方式截然不同。
类型的转换
在C语言中对数据类型的规定是很严格的,整型变量只能保存整数不能保存实数;实型变量只能保存实数,不能保存整数。如果硬要将数据存入不同类型的变量,计算机会以变量的类型为准,自动将数据转换为与变量一致的类型,然后再存入变量。举例:int a;a=2.8;则变量a中只会保存整数2。double y;y=3;则变量y中保存的数据是双精度实数3.0而不是整数3.
这种转换是由计算机自动进行的,称为制动类型转换。
为了与变量的类型一致,也可以为常量规定类型。常量是什么类型呢?写在程序中的整型常量都默认是有符号基本型即int型的,实型常量默认是双精度型即double型的。若要改变常量的类型,可在常量后加字母后缀。字母后缀可以有:L或l。在整数后加L或l表示常量为长整型的,如0l、-125l。若不写l表示常量为基本型。在实数后加l或L表示常量为长双精度型的(long double),如1.234567L。
如果需要表示常量是短整型的,无相应字母后缀,可用强制类型转换如(short)5;
只能写在整数常量之后表示常量为无符号型的,无符号即非负,不能为负数:如0U(u)、6U(u)。不写U或u则表示常量为有符号型的,可以为负数。
表示常量为单精度实型(float型),如8.224f为float型而不是double型的,125f也为float型而不是int型的。即有后缀f时,可不加小数点,也表示实数(单精度实数)。
在整数后可同时加L或U,如0LU、6LU等,表示整数是无符号长整型的。
字符型数据
(1)字符常量:单个字符
每个字符常量占1个字节(8个二进制位)。
字符常量不仅限于字母字符如‘a‘,数字字符’4‘,符号字符’、‘,’!‘等。空格字符' '。单引号必须是英文单引号,''连续单引号是错误的。
一个中文汉字占2个字节,不能作为一个字符常量。一个汉字一般要存储为unsigned short int型的数据。
人们把能录入计算机的每个字符也都安排一个整数的数值编号,这种字符的编号称为ascII码。ascII码是整数,可悲字节转换为二进制。要存储一个字符,只要存储这个字符ascII码的二进制即可。例如:字符'A'的ascII码为65,要存储字符'A'就存储65的二进制;
每类字符ascII码的大小顺序:控制字符(除127外)<空格<数字字符<大写字母<小写字母。
由于字符占1个字节(8比特),因此ascII码范围是0~255(2^8-1)。
ascII码在128~255之间的字符为扩展字符,可作为非英语国家本国语言字符的代码,中文半个汉字的ascII码就在128~255之间(1个汉字占2个字节)。
注意:字符’a‘的ascII码是97,在内存中存为97的二进制,那么整数97也存为97的二进制。如果在计算机中发现存储了一个97的二进制,是无法区分是字符'a',还是整数97的,于是在计算机中就给出了这样一种规则——整数和字符是混用的。例如:字符型量可与整型量做加减乘除的运算,甚至可以和整数比较大小。整数和字符的混用并不难,只要把字符型量替换为对应的ascII码即可。举例:
'C'+1的值为'D',或值为68。
'D'-'A'的值为3,看做68-65。
'7'+'1'的值为55+49=104,或值为字符'h',不是'8'。
'1'<'A'看做49<65,或按照数字字符的ascII码小于大写字母的规则判断。
整数和字符占用的字节数是不同的。一个整数一般占4个字节(在vc++6.0中),而一个字符占1个字节。将整数看做字符时,4个字节中只是用最右端1个字节,而舍弃其他3个字节。将字符看做整数时,会先在它ascII的二进制数之前(左边、高位)补3个8比特都为0的字节凑足“4”字节。由于ascII 码的范围在0~255,一般情况下与之混用的整数也不超过0~255.
注意:大写字母的ascII码比对应小写字母的小32,故大写字母字符+32=对应小写字母字符
小写字母字符-32=对应大写字母字符
转义字符:
转义字符仍表示一个字符,\是与后面内容作为一个整体的。
有特殊含义的字符如果想表示它本身,都必须用转义的形式,不然就分不清是在表示特殊含义还是表示它本身。有特殊含义的字符主要有三个:斜杠(\)、单引号、双引号。要表示这3个字符,必须用\的形式,分别写作:'\\','\'','\"'。
注意:
'\1~3位的八进制数':含义:表示一个字符,这个字符的ascII码的八进制为\后面的数,八进制数不必以0开头,但最多3位。
'\x1~2位的十六进制数':含义:表示一个字符,这个字符的ascII码的十六进制为\x后面的数。x必须小写,十六进制数不要在写前缀0x,最多2位。
使用转义字符,还可以通过字符的ascII码,把任意一个字符表示出来。'x41'、'\101'、'A'等价,都表示字符'A'。课件通过转义字符,对同一个字符可有多种表示方法。
转义字符一定要写在引号之内,因为它仍属于字符常量。
(2)字符变量
用关键字char定义字符型变量,例如:char c;c='A';/*也可写作:c=65*/
一个字符型变量只能保存一个字符。让字符型变量保存整数或参与整数运算也是可以的。因为字符和整数是混用的。由于字符型变量也可保存整数,因此字符型变量也有有符号和无符号的区别,用signed char(或省略 signed)定义的是有符号的字符型变量,可保存-128~127范围的整数;用unsigned char 定义的是无符号的字符型变量,可保存0~255范围的整数。但无论如何均占1字节。
字符串型常量:
字符串包含多个字符,每个字符占一个字节存储,存储的是字符的ascII码的二进制。需要注意的是,字符串在所有字符的最后都必须再多占1个字节存字符’\0‘。
用printf函数可以直接输出字符串常量。举例:printf("nihao!");printf("\101");/*将在屏幕输出A,即输出仅包含一个字符A的字符串*/