《第二章.数据类型、运算符与表达式.ppt》由会员分享,可在线阅读,更多相关《第二章.数据类型、运算符与表达式.ppt(32页珍藏版)》请在三一文库上搜索。
1、程序是解决某种问题的一组指令的有序集合。 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式: 程序 = 数据结构 + 算法,学习的意义,程序是什么?,对数据的描述。在C语言中,体现为数据类型的描述!,对数据处理的描述。是为解决一个问题而采取的方法和步骤,是程序的灵魂!,结论:学好C语言首先就必须十分了解C语言的数据类型、运算符与表达式。,本章所介绍的数据类型,2.1 常量与变量 1. 标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 C语言的关键字不能用作变量名 大小写敏感 长度:有效长度为32个字符。随
2、系统而异,但至少前8个字符有效 命名原则: 变量名和函数名中的英文字母一般用小写,以增加可读性 见名知意 不宜混淆 如l与I, o与0,在TC2.0及BC3.1中,变量名(标识符)的有效长度为个字符,缺省值为,但在VC中其长度可达到255,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123,M.D.John,3days,#33,char,$123,ab,.字符非法,数字3不可作首字符,#字符非法,char是关键字,字符非法,$不可作首字符,2. 常量 定义:
3、程序运行时其值不能改变的量(即常数) 常量的分类 : 直接常量( 值常量) 整型常量: 10、15、-10、-30 实型常量: 12.5、 30.0、-1.5 字符常量: A、b、c 字符串常量: “sum”、“A”、“123” 符号常量 用标识符来代表常量。 其定义格式为:,#define 符号常量 常量,#define NUM 20 #define PI 3.1415926,#include #define PRICE 30 void main ( ) int num, total; num = 10; total = num * PRICE; printf (“total = %d“,
4、total); ,运行结果:total = 300,行尾不能有分号 define前面一定要有# 符号常量名最好使用大写 符号常量名最好有意义,3. 变量 定义:程序运行时其值可以被改变的量 变量的两要素 :变量名 、变量值 变量的定义格式 : 变量的初始化:定义时赋初始值 变量的使用:先定义,后赋值 变量定义位置:一般放在函数开头,存储类型 数据类型 变量名1,变量名2,变量名n;,int x, y, z; float radius, length, area; char ch;,决定分配字节数 和数的表示范围,合法标识符,例: int a = 2, b, c = 4; float data
5、= 3.67; char ch = A; int x = 1, y = 1, z = 1; int x = y = z = 1;,例1: int student; stadent = 19; /Undefined symbol statent in function main,例2: float a,b,c; c = a % b; /Illegal use of floating point in function main,3.3 整型数据,1. 整型常量,三种表示形式,十进制整数:由数字09和正负号表示 . 如:123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如:0123
6、,011 十六进制整数:由0x或0X开头,后跟09,af,AF表示.如0x123,0Xff,定义整数的符号常量 #define NUM1 20 /十进制数20 #define NUM2 020 /八进制数(十进制16) #define NUM3 0x2a /十六进制数(十进制42),思考题:下列整型常量哪些是非法的? 012,oX7A,00,078,0x5Ac,-0xFFFF,0034,7B。,首字符不能是字母o,八进制数中不能有数字8,十进制数中不能有字母B,2. 整型变量,整型变量的定义,int 变量名, 变量名2,变量名n;,int必须小写,至少一个空格,必须为合法的标识符,以逗号,分隔
7、,以分号;结尾,定义时可以赋初值,方法:在变量名后面增加“= 数值”,例: int a; int x, y, z; int m = 2, y = -3;,整型变量的分类,基本整型:int 控制变量是否有符号:signed(有符号)和unsigned(无符号) 控制整型变量的值域范围 :short(短)和long(长)。,有符号基本整型(int 或 signed int): 最高位为符号位,其它的为数据位 无符号基本型(unsinged 或 unsinged int): 都是数据位 不管是由符号还是无符号,整型占一个机器字大小的内存单元。TC或BC3.1下,整型变量占2个字节(16位)的内存单元
8、,所以对于有符号基本整型,其表示范围为(-215215-1),对于无符号基本整型,其表示范围为(0216-1);VC6.0下,变量占4个字节(32位)的内存单元。,如果定义变量时,不指定signed,也不指定unsigned,则默认为signed(有符号),int a = 2; unsigned int b = 2; 在内存中存储的形式为:,int a = -2; /定义一个无符号整型变量a,并赋初值-2 unsigned b = -2; 在内存中的存储形式为:,对于a而言,它的最高位是符号位,所以计算机在使用a时,先对a的最高位进行判断,若最高位为1,表明该数为负数,计算机会对后面的15位进
9、行取反加1操作,得到a的绝对值;对于b而言,它的16位均为数据位,所以b的值其实等于65534。,结论:对于有符号数也好还是无符号数也好,其实在计算机内存中表示是不加区分的,都是以其补码形式表示,只是我们怎样看待最高二进制位的问题,如果把最高位当成符号位看待,则为有符号数,如果把最高位当成数据位看待,则变为无符号数。,有符号短整型(short int或short),short int a = 2; /定义一个有符号短整型变量a,并赋初值2 或 short a = 2; 占用的内存单元为2个字节,无论是TC、BC,还是VC。,无符号短整型(unsigned short int或unsigned
10、short),unsigned short int a = 2; /定义一个无符号短整型变量a,并赋初值2 或 unsigned short a = 2; 占用的内存单元字节数同short类型。,在TC2.0和BC3.1下,unsigned short类型与unsigned int类型是等价的 。,有符号长整型(long int或long),long int a = 234567; /定义一个有符号长整型变量a,并赋初值234567 或 long a = 234567; 占用的内存单元为4个字节,无论是TC、BC,还是VC。,无符号长整型(unsigned long int或unsigned
11、long),unsigned long int a = 2; /定义一个无符号长整型变量a,并赋初值2 或 unsigned long a = 2; 占用的内存单元字节数同long类型。,在VC中long与int类型基本相同,均占四个字节的内存单元;但在TC或BC中,long类型与int类型只是所占字节不同外(long占4字节,int占2字节),其它数据处理方法是一样的。,3. 浮点型数据,浮点型常量(实数或浮点数),十进制小数形式:由数字09和小数点组成 . 如:0.0,5.6,-5. 指数形式:由十进制数,加阶码标志e或E以及阶码(只能为整数,可以带符号)组成. 其一般形式为:aEn 其中
12、:a为十进制数,n为十进制整数,都不可缺少。其可表示为a10n,合法的实数表示: 2.1E5 表示2.1105,3.7E-2 表示3.710-2。,非法的实数表示: 345(无小数点) ,E7(阶码标志E之前无数字) , -5(无阶码标志) ,50.-E3(负号位置不对),实型变量,单精度实型(float) float f = 3.14, g; 这种定义的变量在内存中占4个字节(32位)的存储单元。 双精度实型(double) double x, y; 这种定义的变量在内存中占8个字节(64位)的存储单元。 长双精度实型(long double) long double x, y; 在TC或B
13、C下,这种定义的变量在内存中占10个字节(80位)的存储单元;在VC下则占8个字节(64位)。,6. 字符型数据和字符串常量,字符型常量,定义:用单引号括起来的单个普通字符或转义字符.,如 a A ? n 101,字符常量的值:该字符的ASCII码值,如 A65, a97, 048 , n10,转义字符:反斜线后面跟一个字符或一个代码值表示,如 101 -A 012 -n 376 - x61 -a 60 -0 483 -(),例: A-101-x41-65,字符型变量 字符型数据类型符是char(字符character) 在内存中占1个字节(8位) 字符变量存放字符ASCII码 char与in
14、t数据间可进行算术运算 存在有符号和无符号之分。默认情况下为有符号,例: char ch; unsigned char C = B;,例: a = D; / a = 68; x = A + 5; / x = 65 + 5; s = ! + G / s = 33 + 71;,字符串常量 定义:用双引号(“”)括起来的字符序列,存储:每个字符串尾自动加一个 0 作为字符串结束标志,例: char ch; ch = “A”;,例: char ch; ch = A;,例: “hello”,“123”,“ab1.56“,字符常量与字符串常量不同,3.4 C语言的运算符与表达式,变量用来存放数据,运算符则
15、用来处理数据。用运算符将变量和常量连接起来的符合C语法规则的式子被称为表达式。,运算符的分类: 单目运算符:只带一个操作数的运算符。如:+、-运算符。 双目运算符:带两个操作数的运算符。如:+、-运算符。 三目运算符:带三个操作数的运算符。如:?运算符。,学习运算符时应注意: 运算符的功能:该运算符主要用于做什么运算。 与运算量关系:要求运算量的个数及运算量的类型。 运算符的优先级:表达式中包含多个不同运算符时运算符运算的先后次序。 运算符的结合性:同级别运算符的运算顺序(指左结合性还是右结合性)。 运算结果的类型:表达式运算后最终所得到的值的类型。,1. 赋值运算符、赋值表达式,赋值运算符(
16、“”,双目运算符),一般形式:,变量 = 常量或变量或表达式,功能:将右边常量或变量或表达式的值赋给左边变量,例如: int x, y, z; x = 20; y = x; z = x + y;,赋值表达式,定义:,由赋值运算符或复合赋值运算符(后面即将介绍),将一个变量和一个表达式连接起来的表达式,称为赋值表达式。,一般格式:,变量 (复合)赋值运算符 表达式,赋值表达式的值:被赋值变量的值。,例如:“a = 5”这个赋值表达式,变量a的值“”就是它的值。,赋值语句,例如: x = 8; a = b = c = 5;,定义:赋值表达式在其后面加分号就构成了赋值语句。,赋值运算符及赋值表达式的
17、使用,多个变量连续赋值,例如: a = b = c = 10;,a = (b = (c = 10);,结果:a、b、c的值都为10,赋值表达式的嵌套,例如: a = (b = 2) + (c = 3),( a = (b = 2) + (c = 3),结果:b为2,c为3,a为b+c即5,注意: 赋值语句“=”左边必须是变量名或对应某特定内存单元的表达式(后面的章节会遇到这样的表达式),不能是常量或其它表达式。 例如:30 = a; b + 2 = 5; 都是错误的。 赋值语句中的“=”表示赋值,不是代数中相等的意思。要表示相等的意思则应用关系运算符“=”表示,二者切勿混淆!,2. 强制类型转换
18、符,C语言的数据类型是可以相互转换的。转换的方法有两种:一种是自动转换,一种是强制转换。,自动转换,例如:int a = 2.5; 则a的值将是2,而不是2.5。 这种自动改变等号右边表达式值的数据类型的操作称为数据类型的自动转换。,首先将等号右边的表达式的值转换成“=”左边的数据类型。然后再赋值给等号左边的变量。,(1) 短长度的数据类型 长长度的数据类型,方法:直接将无符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,长长度的数据类型数据的高位部分补零。,无符号短长度的数据类型 无符号或有符号长长度的数据类型,xxx,无符号短长度的数据类型,0,0,.,.,.,.,.,0,.,
19、.,.,.,.,高位部分补0,例如: unsigned char ch = 0xfc; unsigned int a = 0xff00; /假设int数据为16位 int b; unsigned long u; b = ch; /b的值将是0x00fc u = a; /u的值将是0x0000ff00,2. 强制类型转换符,自动转换,(1) 短长度的数据类型 长长度的数据类型,方法:直接将有符号短长度的数据类型的数据作为长长度的数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据的符号位)向长长度的数据类型数据的高位部分扩展。,有符号短长度的数据类型 无符号或有符号长长度的数据类型
20、,zxx,有符号短长度的数据类型,z,符号位向高位部分扩展,z,z,符号位,例如: char ch = 2; int a = -2; int b; unsigned long u; b = ch; /b的值将是2 u = a; /u的值将是0xfffffffe,2. 强制类型转换符,自动转换,(2) 长长度的数据类型 短长度的数据类型,方法:直接截取长长度的数据类型数据的低位部分(长度为短长度的数据类型的长度)作为短长度数据类型的数据。,例如: int a = -32768; /假设int数据为16位 unsigned long b = 0xffffaa00; char ch; int c;
21、ch = a; /ch的值将是0 c = b; /c的值将是0xaa00,(3) 长度相同的数据类型转换,方法:数据按照原样复制即可。,例如: int a = 0xff00; unsigned int b = a; /b的值将是0xff00,2. 强制类型转换符,强制转换,强制类型转换是通过类型转换运算来实现的。其一般形式为:,(类型说明符) (表达式),功能:把表达式的运算结果强制转换成类型说明符所表示的类型。其中,(类型说明符)是强制类型转换符,它的优先级比较高。,例: float x = 3.5, y = 2.1, z; int a; a = (int)(x+y); /结果为5 z =
22、(int)x+y; /结果为5.100000 z = (double)(3/2); /结果为1.000000 a = (int)3.6; /结果为3,精度损失问题,注意:在使用强制转换时应注意以下问题: 类型说明符和表达式都必须加括号(单个变量可以不加括号)。 例如:把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。 例如,(double)a 只是将变量a的值转换成一个double型的中间量,其数据类型并未转换成double型。,基本
23、算术运算符: + - * / % 结合方向:从左向右 优先级: - -* / % - + - (2) (3) (4) 说明: “-”可为单目运算符时,右结合性 两整数相除,结果为整数 %要求两侧均为整型数据,例: 5 / 2 = -5 / 2.0 =,例: 5 % 2 = -5 % 2 = 1 % 10 = 5 % 1 = 5.5 % 2,3. 算术运算符、算术表达式,2,-2.5,1,-1,1,0,(),表达式和算术表达式,3. 算术运算符、算术表达式,表达式:用运算符和括号将运算对象(常量、变量和函数等)连接起来的、符合语言语法规则的式子。 算术表达式:表达式中的运算符都是算术运算符的表达
24、式。,运算符优先级(到目前为止),例: 3 + 5 * 8、(x + y) / 2 - 1等,自增、自减运算符+ - 作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i=i+1或i=i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i=i+1或i=i-1),例: j = 3; k = +j; j = 3; k = j+; j = 3; printf (“%d”, +j); j = 3; printf(“%d”, j+); a = 3; b = 5; c = (+a) * b; a = 3; b = 5; c = (a+) * b;,/k=4,j=4,/k=3,j=4,/
25、4,/3,/c=20,a=4,/c=15,a=4,4. 自增自减运算符、符号运算符,负号运算符(“-”) 减号()既是一个算术运算符,又是一个负号运算符。负号运算符是单目运算符。例如:a = 2,那么a的值就是2。负号运算符的优先级比较高,与强制类型转换符是同一个级别。,自增、自减运算符注意事项 +和-运算符只能用于变量,不能用于常量和表达式。 因为+和-蕴含着赋值操作。 例如:5+、-(a+b)都是非法的表达式。 负号运算符、+、-和强制类型转换运算符的优先级相同,当这些运算符连用时,按照从右向左的顺序计算,即具有右结合性。 两个和之间不能有空格。 在表达式中,连续使同一变量进行自增或自减运
26、算时,很容易出错,所以最好避免这种用法。 例如:+i+是非法的。 自增、自减运算,常用于循环语句中,使循环控制变变量加(或减)-,以及指针变量中,使指针指向下(或上)一个地址。,4. 自增自减运算符、符号运算符,例: int p, i = 2, j = 3; p = -i+; p = ? i = ? p = i+j; p = ? i = ? j = ? p = i+-j; p = ? i = ? j = ? p = i+-j; p = ? i = ? j = ? p = i+i+; p = ? i = ? p = +i+(+i); p = ? i = ?,-2,3,5,3,3,4,2,2,4,
27、3,2,4,4,8,4,5. 算术运算符中数据类型转换规则,#include void main ( ) float a, b, c; a = 7 / 2; /计算7/2得int型值3,因此a的值为3.0 b = 7 / 2 * 1.0; /计算7/2得int型值3,再与1.0相乘,因此b的值为3.0 c = 1.0 * 7 / 2; /先计算1.0*7得double型的结果7.0,然后再计算 7.0/2,因此c的值是3.5 printf (“a = %f, b = %f, c = %f“, a, b, c); ,a = 3.000000,b = 3.000000,c = 3.500000,6
28、. 位运算符、位运算表达式,位运算符:按位与(&)、按位或(|)、按位取反()、按位异或()、左移()六种。,左移() 实现将某变量所对应的二进制数往左移位,溢出的最高位被丢掉,空出的低位用零填补。其一般格式为:,返回整型值的表达式 返回整型值的表达式,例: int a = 3; a 2:将a所对应的二进制数左移两位,该表达式的值为12。 2 a:将2所对应的二进制数左移三位(a的值), 该表达式的值为16。,右移() 右移运算实现将某变量所对应的二进制数往右移位,溢出的最低位被丢掉,如果变量是无符号数,空出的高位用零填补,如果变量是有符号数,空出的高位用原来的符号位填补(即负数填1,正数填0
29、)。其一般格式为:,返回整型值的表达式 返回整型值的表达式,例:int a = 8; a 2:将a所对应的二进制数右移两位,该表达式的值为2。,例: 将short类型数据的高、低位字节互换 #include void main ( ) short a = 0xf245 , b, c; b = a 8 ; /将a的高8位移到低8位赋值给c,c的值为0xfff2 c = c ,a = 0x45f2,位运算之间的优先级 & |,7. 逗号运算符、逗号表达式,位运算符:, 逗号表达式:用逗号连接起来的表达式。其一般形式为:,表达式1,表达式2,表达式k,优先级:优先级最低。 结合性:左结合性 。即逗号
30、表达式的求值顺序是从左向右依此计算用逗号分隔的各表达式的值。 逗号表达式的值:最后一个表达式的值就是整个逗号表达式的值。 用途:常用于循环for语句中。,例如:a+3, b=4, b+,例: a = 3 * 5, a * 4 a = 3 * 5, a * 4, a + 5 例: x = (a = 3, 6 * 3) x = a = 3, 6 * a 例:a = 1; b = 2; c = 3; printf (“%d,%d,%d”, a, b, c); printf (“%d,%d,%d”, (a, b, c), b, c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,
31、表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,例: #include void main ( ) int x, y = 7; float z = 4; x = (y = y + 6, y / z); printf (“x = %dn“, x); ,运行结果:x = 3,8. sizeof运算符、复合运算符,sizeof运算符 功能:获取变量和数据类型所占内存大小(字节数) 格式:,sizeof 表达式 sizeof(数据类型名或表达式),例: sizeof (int) 其值为2(在TC2.0或BC3.1下) 其值为4(在VC6.0下) sizeof (
32、long) 其值是4 sizeof 10L 其值也是4 unsigned long a = 2; sizeof (a) 其值也是4,复合赋值运算符,种类: += -= *= /= %= = &= = |= 含义: exp1 op= exp2 exp1 = exp1 op exp2,定义:将算术运算符、位运算符与赋值运算符组合在一起就构成了复合赋值运算符。复合赋值运算符即包含了算术运算或位运算,又包含了赋值操作。,例: a=12; a+=a-=a*a;,/a=-264 等价于a=a+(a=a-(a*a),例: int a=2; a%=4-1; a+=a*=a-=a*=3;,/a=0 等价于a=a
33、+(a=a*(a=a-(a=a*3),C语言编程习惯,(1) 一行只放一条语句。 (2) 养成随时给程序加注释的习惯。 (3) 程序的书写要有层次感,该缩进的一定要缩进。 (4) 编写函数时,变量定义部分和函数的执行部分之间增加一空行,或者在程序的执行部分按照完成的功能块增加相应的空行,会增加程序的易读性。 (5) 为变量起有意义的名字,既可以帮助程序员读懂程序,也可以避免变量的重复乱用,导致程序的逻辑错误。 (6) 在运算符和赋值符的两边加上一个空格会增加程序的易读性。,本章小结,本章所介绍的主要内容是整型数据、实型数据和字符型数据的常量表示法和变量定义格式,以及可以作用于这些数据类型的运算符。虽然本章的内容比较烦杂,学起来也许比较枯燥,但本章的内容是学好C语言的基础,是每个C语言程序员必须熟练掌握的。现在我们一起来回忆一下本章有哪些内容值得我们特别留意和必须深刻领会的呢? 变量的含义 数据在内存中的表示形式 不同类型的数据在内存中的表示范围 转义字符 有符号数与无符号数的区别 数据类型的自动转换与强制类型转换 各种运算符、运算符的优先级和结合性,
链接地址:https://www.31doc.com/p-2259835.html