460 likes | 588 Views
第三章 数据类型运算符与表达式. 信 息 管 理 系. 3.0 、 C 语言中标识符的概念. 在程序中,由程序设计者使用的名字成为标识符。标识符用以标志区分不同的东西。它可以用作函数的名字、变量、常量的名字,以及文件的名字等等。. 一、 C 语言中的标识符分类. 用户标识符 关键字(语句标识及类型标识) ( P375 附录 II ) 例如: real , main , char , int , float , double , long , if , for , switch , default , break 等 。 预定义标识符(函数名字等)
E N D
第三章 数据类型运算符与表达式 信 息 管 理 系
3.0、C语言中标识符的概念 • 在程序中,由程序设计者使用的名字成为标识符。标识符用以标志区分不同的东西。它可以用作函数的名字、变量、常量的名字,以及文件的名字等等。
一、C语言中的标识符分类 • 用户标识符 • 关键字(语句标识及类型标识)(P375附录II) 例如:real,main,char,int,float,double,long,if,for,switch,default,break等。 • 预定义标识符(函数名字等) 例如:define,include,printf,scanf,sin等。
二、用户自定义标识符的命名规则 • 1、标识符只能由字母、数字和下划线( _ )组成。 • 2、开头字符不能是数字; • 3、不能与关键字重名;(关键字是C语言中规定好的,具有特定意义的一串字符,关键字都是小写字母的) • 4、最好不要与预定义的标识符重名; • 5、区分大小写。即A与a是不同的名字,一般要求都用小写字母。 • 6、一般不要超过8个字符。 • 例如:判断下面哪些是C语言中合法的标识符的是: • aa int INT a2_ 2a a-b a_b b_2 2b abc a#b ab? A_a
3.1、C程序中的数据类型 短整型(short) 整型 整型(int) 长整型(long) 基本类型 C 语 言 的 数 据 类 型 单精度(float) 实型(浮点型) 双精度(double) 字符型 枚举类型 数组 构造类型 结构体(struct) 指针类型 共用体(union) 文件(file) 空类型(void)
类型 标识符 占用空间(字节) 表示范围 整型 有符号标准 int 2 (-32768~32767) -215~215-1 有符号短 short 2 (-32768~32767) -215~215-1 有符号长 long 4 (-2147483648~2147483647) -231~231-1 无符号标准 unsigned int 2 (0~65535) 0~216-1 无符号短 unsigned short 2 (0~65535) 0~216-1 无符号长 unsigned long 4 (0~4294967295) 0~232-1 字符型 char 1 实型 单精度 float 4 双精度 double 8 一、C语言中的基本数据类型
二、常量 常量:在程序运行中,其值不能被改变的量称为常量 常量有五种类型:整型常量、实型常量、字符常量、字符串常量和符号常量 1、整型常量: 用十进制表示:如123,123u,123L,123l, -123L。 用八进制表示(以0开头):如012,013L,-013u等。 用十六进制表示(以0x)开头:如0x12, 0xAB, -0xAL, 0xBu等。 注:其中L(或l)表示该数为长整型,U(或u)表示该数为无符号的整数
二、常量 2、实型常量 实型常量有两种表示形式: 小数形式:45.3,0.2,-623.00,.2,2.,2 指数形式:45.3e0,45.3e-2,0.45E+2,3.2e3,.5e32 注意: • 小数部分为0的实型常量,可以写为453.0,也可以依照日常习惯写成453 • 数字之间不能出现空格; • 用指数形式时,e(或E)的左右两端必须有数,且指数部分必须为整数。
二、常量 判断下列那些是合法的C常数: -0. 32 -0x2al 0x7g 012 -018 123u 0x7L 0x7u 003 e3 3.e-5 7ff 9e+2.3 .3e-3 2 34 0x2A 0xAU
字符形式 功能 字符形式 功能 \n 换行 \f 走纸换页 \t 横向跳格 \\ 字符\ \v 竖向跳格 \’ 字符’ \b 退格 \ddd 1~3位8进制代表的字符 \r 回车 \xhh 1~2位16进制代表的字符 二、常量 3、字符常量 C语言中规定字符常数在书写的时候要放到‘’中间。 如‘’,’a’,‘#’,‘1’等。 字符在计算机中存放的是他们的ASCII。但在‘’中不能放’和\。即’’’是不对的。(见P374附录I) 除了形式上的字符常量外,C语言还有特殊的字符常量,如转义字符常量。 也就是说符号在C程序中可用三种方法表示:如A(ASCII码为65) ’A’’\101’’\x41’ 如:已知的ASCII码为001,那么符号在C程序中可写为‘\001’。
01100011 01101000 01101001 01101110 01100001 \0 二、常量 4、字符串常量 字符串常量是用双引号括起来的一个或一串字符。 如:“China” “How are you.” “@sohu.com”等 字符串在存储的时候会自动在末尾加上‘\0’,表示结束。字符串中字符的个数成为字符串的长度。 如“china”在内存存储如下: 思考:“A”与‘A’有什么不同? 下列那些是合法的C常数: ‘\n’‘\261’‘\28’‘\x21’“ABC29 BG”‘ab’ 0x2.5b 7ff 8L ‘’’ ? 5、符号常量 符号常量是由宏定义“#define”来定义的常量,在C语言中可用标识符代表一个常量。 如:#define PI 3.14159
三、变量 在程序的运行过程中,其值可以改变的量称为变量。 变量要有变量名,在内存中占据一定的存储单元,存储单元里存放的是变量的值。不同类型的变量所占存储单元大小不同,变量在使用前必须先定义。 1、变量的定义 变量的定义格式: 数据类型 变量名; 如:int a,b; /*定义两个整型变量这两个变量可以分别存放一个int型的数据*/ float f; /*定义一个实型变量f ,可以存放一个单精度类型的实数*/ char c; /*定义一个字符类型的变量c,可以存放一个字符*/ 注: 变量的名字必须满足用户标识符的命名规则。 若同时定义多个同类型的变量,则中间用逗号(,)隔开。
三、变量 2、变量的赋值 变量被定义以后,就可以存放相应类型的数据了。 给变量一个值,我们称之为给变量赋值, 用操作符 =来实现。 我们还可以在定义变量的同时给变量一个值,称为变量初始化。 如:int i=3, b=5, c; char c=’a’; float f=3.1415; c=b; 在给变量赋值的时候,我们要把一个相同类型的常数赋给一个变量。
三、变量 3、变量值的存储 变量被定义以后,系统在运行时会为该变量分配一个相应大小的存储空间,称为存储单元。 给变量赋值后,该变量对应的存储单元中会存放该值,这个值称为变量的值。 那么变量的值在变量的存储单元中是如何表示的呢? (1)整数是以补码的形式存放的。 (正数的补码是其本身,负数的补码为原码按位取反加1) 如:int a=2, b; b= -2; a b 2的原码表示:00000000 00000010 -2的补码表示:11111111 11111101+1=11111111 11111110
0 1 0 1111111 0000000 0000000 11111111 00000000 00000000 16 15~9 8~1 16 15~9 8~1 16 15~9 8~1 三、变量 (2)、特殊情况:最大、最小和0的存储 最大值:215-1(32767) 最小值:-215(-32768) 0的存储如下:
三、变量 (3)、超出范围的情况(溢出):如: ①、阅读下面的程序段,程序段的输出结果是() int i=65536; printf(“%d”, i ); A)65536 B)0 C)有语法错误,无输出结果 D)1 说明:65536=216,即:10000000000000000,第17位上为1,后面16位均为0。存储时只能存放16位,即16个0。故结果为0。 ②、若有下面的程序段,则输出结果为() int a=32768; printf(“%d”, a); 说明:32768=215,即1000000000000000,第16位上为1,后面15位均为0。存储时只能存放16位,最高位为1,故结果为-32768。 ③、若有下面的程序段,则输出结果为() int a=65549; printf(“%d”,a); 已知65549=10000000000001101B (13) int b=131069; printf(“%d”,a); 已知131069=11111111111111101B (-3)
操作符 作用 运算对象 运算结果 优先级 结合性 * 乘 整型或实型 整型或实型 1 自左向右 / 除 % 求余 整型 整型 + 加 整型或实型 整型或实型 2 - 减 3.8 运算符与表达式 (一)、算术运算符和算术表达式 说明:1、优先级:5+2*3 2、结合性:5*2%3 用算术运算符和小括号将数值连接起来的式子叫算术表达式。 如:1+2*(3-1)%2
(一)、算术运算符和算术表达式 • 写出下列算式的C语言表达式: ① ② ③ (求平方根的函数为sqrt) 如:以下变量x,y,z均为double类型且已正确赋值,不能正确表示数学式子 的C语言表达式的是() A)x/y*z B)x*(1/(y*z)) C)x/y*1/z D)x/y/z b/(a+b/a) (x-y*z)/(a+b+c) sqrt((a+b)*(b+c)*(c+a))
(一)算术运算符和算术表达式 表达式的值: 表达式运算得到的最终结果为表达式的值。 也就是整个式子代表的值 如a=5,b=2; a+b 7
(二)赋值运算符和赋值表达式 赋值运算符:=格式:变量=表达式 如:int a,b; 下面都是正确的赋值表达式 a=5; b=3; a=2+3; a=a+2; b=a*a; 赋值运算为“从右向左”结合的。 如x=y=z=3 它等价于:x=(y=(z=3))
(三)自反运算 赋值运算中有如下的特殊形式:变量在原先的基础上做一些运算后的结果,作为新的变量的值。这些表达式又可写为后面的形式。这些运算符+=、-=、*=、/=、%=叫做自反运算符。分别称为自反加、自反减、自反乘、自反除和自反取余(自反取模)。这样的运算称为自反运算。 a=a+b; a+=b; a=a-b; a-=b; a=a*b; a*=b; a=a/b; a/=b; a=a%b; a%=b; 由于该运算可看作是一种特殊的赋值运算,故其结合性仍然是“自右向左”的。 如:a=b*=a+2 等价于b=b*(a+2); a=b; 如:设k=2, i=2, m=(k+=i*=k) 则m= i= (6,4)
(四)自加、自减运算 自加、自减运算符的作用是使变量的值增1或减1。 运算符为:++、――。 如:++a, a++, - -a, a- - 自加与自减运算是一种特殊的赋值运算。 ++、――在前表示变量的值先加1,再作为整个表达式的值。 ++、――在后表示先将变量的值作为表达式的值,然后变量的值再加1。 如:设a=5; b=a++; 则b=5, a=6; b=++a; 则a=6, b=6; b=a--; 则b=5, a=4; b=--a; 则a=4, b=4; 自加、自减运算也是赋值运算,故运算的对象只能是变量,不能是常数或表达式。 即:5++ (x+y)++ 都是错误的。
复习巩固练习: 1、已知大写字母A的ASCII码是65,小写字母a的ASCII码是97,则字符常量’\101’指的是() A)字符A B)字符a C)字符e D)非法的常量 2、以下选项中合法的实型常数是() A)5E2.0 B)E-3 C).2E0 D)1.3E 3、在C语言中,合法的长整型常数是() A)0L B)4962710 C)324562& D)16D 4、以下选项中,不属于C语言的数据类型的是() A)signed short int B)unsigned long int C)unsigned int D)long short 5、以下选项中,与k=n++完全等价的表达式是() A)k=n, n=n+1 B)n=n+1, k=n C)k=++n D)k+=n+1 6、以下程序段的输出结果是() int x=10,y=10; printf(“%d %d”, x--, ++y) 7、设int a=2, 则执行完语句a+=a-=a*a后,a的值为() 10 11 -4
复习巩固练习: 8、C语言中int型变量所占字节数是() 9、与数学式子 对应的C语言表达式是() A)3*x^n/(2*x-1) B)3*x**n/(2*x-1) C)3*pow(x,n)(1/(2*x-1)) D)3*pow(n,x)/(2*x-1) 10、C语言提供的合法的数据类型标识符是() A)Double B)short C)interger D)Char 11、C语言中运算对象必须是整型的运算符是() A)%= B)/ C)= D)^ 12、下面合法的C语言字符常量是() A)’\t’ B)”a” C)65 D)A 13、若有int a=5;则表达式a++的值是() 14、以下程序的输出结果是() main() {int a=0; a+=(a=8); printf(“%d”, a ); } 2 2 16
复习巩固练习: 15、以下程序的输出结果是() main() {int x=023; printf(“%d”,--x); 16、下列选项中,不能用作标识符的是() A)_1234_ B)_1_2 C)int_2_ D)2_int_ 17、有以下程序 main() {char a=’a’ , b; printf(“%c,” , ++a); printf(“%c\n”, b=a++); } 程序运行后的输出结果是() A)b, b B)b, c C)a, b D)a, c 18、以下程序运行后的输出结果是() main() {int a, b, c; a=25; b=025; c=0x25; printf(“%d %d %d\n”,a,b,c); } 18 25 21 37
五、关于算术运算与赋值注意事项 1、+、-、*、/ 运算,运算对象是整型、实型均可。(+=、-=、*=、/=同) 整型+(-、*、/)整型=整型 如:3+2=5 9/5=1 实型+(-、*、/)实型=实型 如:3.0+2.0=5.0 9.0/5.0=1.8 若两个操作数一个为整型、一个为实型,则结果为实型。 如:3+2.0=5.0 9.0 / 5=1.8 2、关于%运算对象只能为整型数据。同样%=的运算对象也只能为整型数据。 如:3.5%2是不对的。
五、关于算术运算与赋值注意事项 3、关于字符数据与整型数据 由于字符数据在运行时是以ASCII码的形式存储的,故字符数据与整型数据之间存在天然的联系。 ①可以将整型数据赋值给一个字符变量。则这个字符变量的值为该整型数据对应的字符。 如:char ch; ch=65; printf(“%c”,ch); 则会输出A ②可以将一个字符赋值给一个整型变量,整型变量的值为该字符的ASCII码值。 如:int a=’A’; printf(“%d”,a); 则输出65。 ③若将一个字符变量按整型方式输出,则输出其ASCII码。 如:char ch=’A’; printf(“%d”, ch); 则输出65。 ④若字符型数据与整型数据产生混合运算,则字符型数据将自动转换成对应的ASCII码值后,再参与运算。 如:int i=5, b; char ch=’A’; 则i+ch的结果为70。
doublefloat 高 long unsigned intchar, short 低 六、数据类型转换 1、算术运算符转换: C语言中,整型、实型、字符型数据之间可以混合运算。再进行运算时,不同类型的数据要先转换成同一类型的数据,然后再进行运算。转换规则如下:
六、数据类型转换 当一个算术运算符两端的运算量不一致时,按“向高看齐”的原则,对较低的类型进行提升。 如:char ch; int i , result ; float f; double d; result = ch / i + f * d – ( f + i ) int double double double int double double double double int double
六、数据类型转换 2、赋值转换 C语言允许通过赋值使赋值号右边表达式值的类型转换为其左边变量的类型。如上图1中,右边表达式的值为double类型,但经过赋值运算却转换为int类型。即result中的最终结果为一个整数。 即:赋值转换具有强制性,赋值号右边的表达式要强制转换成左边变量的形式。 又如:int a; a=5.8; printf(“%d”, a ); 则输出5。
六、数据类型转换 3、不同类型数据的显式转换 在C语言中,有一种“强制类型转换运算符”,它能将某以类型的变量强制转换为另一种类型,它的一般形式为: (类型标识符)表达式 如:printf ( “ %c ”, (char)(67-1.2)); 会输出A。 如:float x=4.5; int i; i=(int)x; printf(“%d %f “, i, x); 则会输出4 4.5000 即:x的值仍为4.5,i的值为x值的整数部分。 又如: (int)(x+y) 不能写为 int(x+y)
六、数据类型转换 4、输出转换 在输出语句中,也会发生隐式转换。如: float f=5.8; printf(“%d”, f ); 则输出5。 如果是int a=5.8; printf(“%f”, a); 在编译时不用出错,但不会输出结果。 再如:int i = - 1; printf(“%u”, i ); 则会输出()。 -1的原码:000000000000001,补码为:111 1111 1111 1111 存储形式为16个1。故当作为无符号数输出时,应输出65535(216-1)。
巩固练习 1、变量a是int 类型,并执行了语句:a=’A’+1.6; 则正确的叙述是() A)a的值是字符C B)不允许字符型和浮点型相加 C)a的值是浮点型 D)a的值是字符’A’的ASCII码加上1。 2、设a、b均为double型变量,且a=5.5;b=2.5,则表达式(int)a+b/b的值是() A)6.500000 B)6 C)5.500000 D)6.000000 3、已知int m=3,n=4, x; 则x= -m++; x=x+8/++m; 后,x=( ),m=( )。 -2 5
关系运算符 作用 优先级 运算对象 运算结果 结合性 > 大于 1 整型 实型 或字 符型 关系成立 则为真, 结果为1 关系不成立则为假, 结果为0 自左向右 < 小于 >= 大于等于 <= 小于等于 = = 等于 2 != 不等于 七、关系运算符和关系表达式 关系运算符:
七、关系运算符和关系表达式 1、由关系运算符和()将操作数(也叫运算量)连接起来的式子叫逻辑表达式。 2、关系运算符的优先级低于算术运算符,高于赋值运算符。(若一个式子中既有关系运算、赋值运算,又有算术运算,先做算术运算,再做关系运算,最后做赋值运算。) 如:a=1+2>3-1 等价于:a=((1+2)>(3-1)) 关系成立,a的值为1。 又如:2= =3 表达式值为0, 10!=9 表达式值为1,2>=3 表达式值为0。 又如:2==3<=5 等价于 2==(3< =5) 表达式值为0。 又如:z=3+1==2+3-1<=5+6*2 先做算术运算(先乘除取余,后加减,相同级别的从左向右做): z=3+1==2+3-1<=5+12 z=4==4<=17 后做关系运算(先>、<、>=、<=,后==、!=):z=4==1 z=0最后做赋值运算。 3、特别要注意“==”与“=”的区别。
逻辑运算符 a 作用 b 运算对象 ! a 运算结果 ! b 优先级 a && b 结合性 a || b 非0(T) 非0(T) 0 0 1 1 ! 逻辑非 整型 实型 或字符型 0或1 1 自右向左 非0(T) 0(F) 0 1 0 1 && 逻辑与 2 自左向右 0(F) 非0(T) 1 0 0 1 || 逻辑或 3 0(F) 0(F) 1 1 0 0 八、逻辑运算和逻辑表达式 逻辑运算符:
八、逻辑运算和逻辑表达式 1、参与逻辑运算时,非0为真,0为假。结果真为1,假为0。 2、用逻辑运算符和()将操作数(运算量)连接起来的式子称为逻辑表达式。 3、优先级:逻辑非(!)>算术运算符 >关系运算符 >逻辑与(&&)>逻辑非(||)>赋值运算符。 4、注意:若&&的第一个操作数为0,则第二个操作数不再计算;若||的第一个操作符为非0,则第二个操作数不再计算。如例3。 如:5&&2 3&&0 0&&0 1&&5 1&&0 0&& .2 5 || 2 3 || 0 0 || 0 1 || 5 1 || 0 0 || .2 !5 !0 !1 ! .5
八、逻辑运算和逻辑表达式 例1:已有定义:int x=3, y=4, z=5; 则表达式 !(x+y)+z-1&&y+z/2 的值是() A)6 B)0 C)2 D)1 例2、语句printf(“%d”, (a=4) && (b=-3) )的输出结果是() 【注】 例3、设x, y, z 均为int型变量,则执行语句x=y=3;t=++x || ++y 后,y的值为() 【注】 例4、10<x≤100 或x<0的C语言表达式为: 【注】!7+5-1&&4+5/2 0+5-1&&4+2 4&&6 1 1 3 【注】 (x>10 && x<=100)|| (x<0)
y 2 1 1 2 x 八、逻辑运算和逻辑表达式 例5、写出点(x,y)落在图2环形部分的C语言表达式。 练1、以下程序的输出结果是() main() {int a=4, b=5, c=0, d; d=!a && !b || !c; printf(“%d”,d ); } 练2、设a,b,c,d,m,n均为int类型变量,且a=5,b=6,c=7,d=8,m=2,n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为() A)0 B)1 C)2 D)3 (x*x+y*y>=1 && x*x+y*y<=4) == 1 1
八、逻辑运算和逻辑表达式 练3、若变量c为char类型,能判断出c为小写字母的表达式是() A)a<=c<=z B)’a’<=c<=’z’ C)(c>=’a’ ) || (c<=’z’ ) D)(c>=’a’) && (c<=’z’) 练4、以下程序的输出结果是() main() {int a=5, b=4, c=3,d; d=(a>b>c); printf(“%d”, d ) ; } 练5、设y是int 型变量,写出判断y 为奇数的关系表达式()。 练6、若已知a=10, b=20, 则表达式!a<b的值是() 练7、若x和y代表整型数,写出表示数学关系 |x-y| < 2的C语言表达式() 0 y%2==1 1 (x-y)>0&&(x-y)<2 || (x-y)<0&&(x-y)>-2
九、逗号运算符和逗号表达式 C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来,称为逗号表达式。逗号运算符又称为顺序求值运算符。逗号表达式的一般形式为: 表达式1,表达式2 1、逗号表达式的求解过程为:先求解表达式1,再求解表达式2。结合性自左向右。 2、整个逗号表达式的值是表达式2的值。 3、逗号运算符的优先级是所有运算符中最低的。 如:a=(3+5,6+8); 则a的值为14。 又如:a=3*5, a*4 先求a=3*5, 再求a*4, 故整个逗号表达式的值为:60。 4、逗号表达式可扩展为:表达式1,表达式2,表达式3,……,表达式n 它的运算规则为依次求解表达式1到表达式n的值,整个表达式的值为表达式n的值。如(a=3*5,a+10),a/5,a*2的值为30
九、逗号运算符和逗号表达式 例1、假定x和y为double类型,则表达式x=2,y=x+3/2的值是() A)3.500000 B)3 C)2.000000 D)3.000000 例2、若已定义x,y为int 类型,则表达式:x=2, y=x+3/2.0的值是() B
十、条件运算符和条件表达式 又叫问号运算符与问号表达式 条件运算符有三个操作对象,称三目(元)运算符,条件表达式的一般形式为: 表达式1?表达式2:表达式3 说明: 1、条件运算符的求解顺序是: 2、条件运算符的值比关系运算和算术运算都低,但高于赋值运算符。 如:max=a>b? a:b ; 就等价于:max=(a>b? a:b); 3、条件运算符的结合方向是“自右向左”的。 如:a>b? a:c>d?c:d 等价于:a>b?a:(c>d?c:d ) 4、表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。 如:a > b ? ( a =100 ) : ( b =100 ) ; a > b ? printf ( “ %d ” , a ) : printf ( “%d” , b ); 若值为非0数,则整个表达式的值为表达式2的值 求表达式1的值 若值为0,则整个表达式的值为表达式3的值
十、条件运算符和条件表达式 例1、若x=1, y=2, z=3,计算x > y ? x : (y > z ? y : z)的值。 先计算y>z=0,故括号中的部分值为3;剩余部分为:x > y ? x : 3,显然值应为3。 例2、x, y ,z值为上题所给,计算x = =y ? ( x > z ? x : z ) : y 2
运算符 作用 操作数个数 优先级 结合性 () 括号 1 自内而外 !、+、-、++、--、(类型) 逻辑非、正、负、自加、自减、强制类型转换 1(单目运算符) 2 自右向左 *、/、% 算术乘、除、取余 2(双目运算符) 3 自左向右 +、-、 算术加、减 4 >、>=、<、<= 关系运算 5 = =、!= 关系运算 6 && 逻辑与 7 || 逻辑或 8 ? : 条件运算符 3(三目运算符) 9 自右向左 =、+=、-=、*=、/=、%= 赋值运算符 2(双目运算符) 10 , 逗号运算符 多目 11 自左向右 运算符与表达式总结
运算符与表达式总结 说明: 1、不同级别的运算符,其运算顺序是由优先级决定的。 2、同一优先级的运算符,其运算顺序是由结合方向决定的。 3、不同的运算符要求有不同的运算对象个数。 4、各类运算符的优先级可大致归纳为: 括号 → 单目运算符 → 算术运算符(先乘除,后加减) → 关系运算符 → 逻辑运算符(不包括!) → 条件运算符 → 赋值运算符 →逗号运算符 5、要求在书写时,可适当使用(),以免产生不必要的麻烦。