1、第 二 讲 数据类型、运算符与表达式,2,2.1 数据类型2.2 常量与变量2.3 数据类型转换2.4 运算符与表达式,3,2.1 数据类型,数据类型是按被定义变量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。,4,5,2.2 常量与变量,对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、 枚举变量。在程序中,常量是可以
2、不经说明而直接引用的,而变量则必须先定义后使用。 整型量包括整型常量、整型变量。,6,常量和符号常量,直接常量(字面常量): 整型常量:12、0、-3; 实型常量:4.6、-1.23; 字符常量:a、b。符号常量:用标示符代表一个常量。在语言中,可以用一个标识符来表示一个常量,称之为符号常量。 符号常量在使用之前必须先定义,其一般形式为: #define 标识符 常量,7,#define PRICE 30 main() int num,total; num=10; total=num* PRICE; printf(“total=%d”,total); ,8,使用符号常量的好处是:含义清楚; 能
3、做到“一改全改”。,9,变量,一个变量应该有一个名字,在内存中占据一定的存储单元。变量的类型决定了该存储空间的长度和其中存放数据的编码方式及存储格式。变量的类型也决定了该存储空间中存放数据的数据形式和取值范围。变量定义必须放在变量使用之前。一般放在函数体的开头部分。,10,11,整型数据,整型常量 整型常量就是整常数。在语言中,使用的整常数有八进制、十六进制和十进制三种。 十进制整常数:十进制整常数没有前缀。其数码为 09。以下各数是合法的十进制整常数: 237、-568、65535、1627; 以下各数不是合法的十进制整023 (不能有前导 0)、23D (含有非十进制数码)。,12,八进制
4、整常数:八进制整常数必须以 0 开头,即以 0 作为八进制数的前缀。数码取值为 07。八进制数通常是无符号数。 以下各数是合法的八进制数: 015(十进制为 13)、0101(十进制为 65)以下各数不是合法的八进制数:256(无前缀 0)、03A2(包含了非八进制数码)、-0127(出现了负号)。,13,十六进制整常数:十六进制整常数的前缀为 0X或 0x。其数码取值为 0 9,AF 或af。 以下各数是合法的十六进制整常数: 0X2A(十进制为 42)、0XA0 (十进制为 160)、 0XFFFF (十进制为 65535); 以下各数不是合法的十六进制整常数: 5A (无前缀 0X)、0
5、X3H (含有非十六进制数码)。,14,在计算机中,数值是以补码表示的: 正数的补码和原码相同; 负数的补码,将该数的绝对值的二进制形式按位取反再加 1。,15,求-10 的补码: 00000000 00000000 00000000 00001010 10 的原码: 00000000 00000000 00000000 00001010 取反 11111111 11111111 11111111 11110101 再加 1, 得 10 的补码: 11111111 11111111 11111111 11110110,16,整型变量,int 在 C 语言中用于存储整数 int 32 位 214
6、7483648 2147483647, (-231231-1) 如 4(十进制) 0000 0000 0000 0000 0000 0000 0000 0100,在16位操作系统中,一般用字节表示一个int型变量,且long型(字节)int型(字节)short型(字节)。在VC+6.0环境中,用4字节表示一个int型变量,且long型(字节)int型(4字节)short型(字节)。,17,声明: int length; long int num; unsigned int age; 可按如下方式初始化: length = 0; int width = 100;在同一语句中可以声明多个类型相同的
7、变量: int a,b,c;,18,整型数据的溢出 #include void main() int a,b;a=2147483647;b=a+1; printf(“%dn%dn“,a,b); ,19,实型数据,实型常量实型也称为浮点型。实型常量也称为实数或者浮点数。在语言中,实数只采用十进制。它有二种形式:十进制小数形式,指数形式。十进制数形式:由数码 0 9 和小数点组成。 例如: 25.0、5.789、0.13、5.0、300.、-267.8230 均为合法的实数。注意,必须有小数点。,20,指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式
8、:a E n(a 为十进制数,n 为十进制整数),其值为a*10n。如: 2.1E5 (等于2.1*105) 3.7E-2 (等于3.7*10-2),21,以下不是合法的实数: 345 (无小数点) E7 (阶码标志 E 之前无数字) -5 (无阶码标志) 53.-E3 (负号位置不对) 小数点不能单独出现; e或E的两边必须有数,且其后面必须为整数;,22,实型变量,关键字 字节数 取值范围 精度(位) float 4 3.410-38 3.41038 7 double 8 1.710-308 1.710308 16,23,float 在 C 语言中用于存储单精度浮点数 float 32 位
9、 10-38 至 10+38 ,7位有效数字声明: float price; 初始化: float price = 11.3; price = 65.90;,24,double 在 C 语言中用于存储双精度浮点数 double 64 位,10-308 至 10+308 ,16位有效数字声明: double pai; 初始化: double pai = 3.1415926589; pai = 3.1415926589;,25,字符型数据,字符常量字符常量是用单引号括起来的一个字符用单引号括起来的由反斜杠()引导的转义字符。 例如: a、b、=、+、? 字符A的ASCII码为:65D(十进制)=4
10、1H(十六进制)=101Q(八进制)字符A可以表示为A、x41、101。,26,ASCII,27,转义序列,28,占 8 位内存,signed 或unsigned,Signed -128 至 +127,unsigned0 至 255,示例:,char gender; gender=m;,char gender=m;,字符变量,29,字符型可参与数学运算,也可看成一种一字节的整型变量。 例: #include void main() char a,b;a=a;b=a+2;printf(“%cn“,b); ,c Press any key to continue,30,例: #include vo
11、id main() char a=A;int b;b=a+1;printf(“%dn“,b); ,66 Press any key to continue,31,字符串常量,字符串常量是由一对双引号括起的字符序列。例如: “CHINA“ , “C program” , “$12.5“ 等都是合法的字符串常量。,32,字符串常量和字符常量是不同的量。它们之间主要有以下区别: 1) 字符常量由单引号括起来,字符串常量由双引号括起来。 2) 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。 3) 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的
12、字符串变量。但是可以用一个字符数组来存放一个字符串常量。在数组一章内予以介绍。 4) 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加 1。增加的一个字节中存放字符“0“ (ASCII 码为 0)。这是字符串结束的标志。,33,例如: 字符串 “C program” 在内存中所占的字为:字符常量a和字符串常量“a”虽然都只有一个字符,但在内存中的情况是不同的。 a在内存中占一个字节,可表示为: “a“在内存中占二个字节,可表示为:,34,2.3 数据类型转换,自动类型转换 原则:把表示范围小的类型的值转换到表示范围大的类型的值 int float double 强制类
13、型转换 语法:(类型名) 变量或数值 例如: int a = 5, b = 3; float shang = (float)a / b;,35,例:,#include void main() int a=5,c;double d;c=a/3;d=a/3;printf(“c=%dn“,c);printf(“d=%fn“,d); ,c=1 d=1.000000 Press any key to continue,36,例:,#include void main() int a=5,c;double d;c=a/3;d=a/3.0;printf(“c=%dn“,c);printf(“d=%fn“,d
14、); ,c=1 d=1.666667 Press any key to continue,37,例:,#include void main() int a=5,c;double d;c=a/3;d=(double)a/3;printf(“c=%dn“,c);printf(“d=%fn“,d); ,c=1 d=1.666667 Press any key to continue,38,2.4 运算符与表达式,运算符:就是表示某种运算功能的符号。 运算符的主要类型有:算术运算符赋值运算符关系运算符逻辑运算符 表达式:由常量、变量、函数和运算符组合起来的式子。 如:a+b 、 a=c*d,39,算术
15、运算符,40,+(加):2+3 -(减):3-1 *(乘):3*2 /(除):5/3、5.0/3(注意,此二种形式,结果不同)优先级:() *、/、% +、- 结合性:从左至右; 如:2+3-5,41,%(取余)(注意:取余运算的操作数只能是整数,结果的符号与被除数相同)5%2的值为1; -5%2的值为-1; 5%(-2)的值为1; -5%(-2)的值为-1;,42,自增、自减运算符: 自增 1 运算符记为“+”,其功能是使变量的值自增 1。 自减 1 运算符记为“-”,其功能是使变量值自减 1。 自增 1,自减 1 运算符均为单目运算,都具有右结合性。可有以下几种形式: +i i 自增 1
16、后再参与其它运算。 -i i 自减1 后再参与其它运算。 i+ i 参与运算后,i的值再自增 1。 i- i 参与运算后,i 的值再自减 1。,43,a=5; 等价于 a=5;b=a+; b=a; b=5a+; a=6a=5; 等价于 a=5;b=+a; a+; a=6b=a; b=6,44,#include void main() int i=8; int a;a=+i;printf(“%dn“,a); a=i+;printf(“%dn“,a); a=-i;printf(“%dn“,a); a=i-;printf(“%dn“,a); ,9 9 9 9 Press any key to con
17、tinue,45,例,#include void main() int i=5,j=5,p,q; p=(i+)+(i+)+(i+); q=(+j)+(+j)+(+j); printf(“p=%dnq=%dni=%dnj=%dn“,p,q,i,j); ,p=15 q=24 i=8 j=8 Press any key to continue,46,C 编译器的“最大贪婪”规则 当C 语言编译器对源程序进行词法分析时, 如果运算符的下一个符号还是运算符, 并且能和前一个运算符构成一个新的合法运算符时, 编译器的词法分析器必须将其解析为两个运算符符号构成的新的运算符( C 语言中没有3 个符号构成的运
18、算符) 。例如: x=z+y;是按照x=z+( +y) ; 来计算; 还是按照x=( z+) +y;来计算呢? 根据C 编译器的“最大贪婪”规则, 就必须按照x=( z+) +y; 来计算, 而不是按照x=z+( +y) ; 来计算。,47,例: #include void main() int a=10;int b=5,c;c = b+a;printf(“%d %d %d “,a,b,c); ,10,6,15,48,例: #include void main() int i=1,j;j=i+i+i+;printf( “i=%d,j=%dn“, i,j); ,j=(i+)+(i+)+(i+),
19、i=4,j=3,49,赋值运算符,变量 表达式;,Height = 177.5; Weight = 78; Gender = m; x = a+b; w = sin(a)+sin(b); y = i+ -j;,=,最简单的运算符:,50,复合赋值运算符,51,#include void main () int num = 30;printf(“n 原有人数 = %d“,num);num += 10;printf(“n 现在人数 =%dn“,num); ,输出: 原有人数 = 30 现在人数 = 40,52,关系运算符,关系运算符用于测试两个操作数或两个表达式之间的关系,其中操作数可以是变量、常
20、量或表达式。,操作数,关系运算符,关系表达式的 计算结果 = 逻辑值(真或假) 在C语言中,“0”表示“假”,“非0”表示“真”,操作数,53,关系运算符,!=,=,=,=,操作数1,操作数2,54,结合性:自左至右; 表达式的值: 若为真,则结果为1;若为假,则结果为0。 例如: 35 结果为0,55,逻辑运算符,逻辑运算符用于连接一个或多个条件,判断这些条件是否成立 逻辑运算符的类型为:,56,参与逻辑运算的操作数叫逻辑量。逻辑量可以是整型、实型、字符型和指针类型,其中,0,0.0,0,NULL代表假,其余逻辑量代表真。表达式的值: 若为真,则结果为1;若为假,则结果为0。,57,例 in
21、t a=2; double b=1.8;!a ( ) !(a b) ( ) a & b ( ) !a|b ( ),0,1,1,1,58,条件运算符,?,?,条件表达式,考试是 否及格?,是,不是,真,表达式1,假,表达式2,59,if (num100) value=y; else value=n; ,使用“if-else”的等同代码,假设 num = 200,value = num 100,;,?,y,:,n,200,value,=,y,60,#include void main() double sal;double rate;printf(“n 请输入基本工资:“);scanf(“%lf“
22、, ,请输入基本工资:1500 税后工资为:1475.00 Press any key to continue,61,逗号运算符,在语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把两个表达式连接起来组成一个表达式, 称为逗号表达式。 其一般形式为: 表达式 1,表达式 2 ,表达式n 求值过程:从左至右依次计算各表达式的值,并以表达式n的值作为整个逗号表达式的值。,62,例 a b c 表达式 c=a=2,b=3,a+b; c=(a=1,b=4,a+b);,2,3,2,5,1,4,5,5,63,sizeof运算符,使用 sizeof 运算符可以获得数据类型占用内存空间的大小。其一般
23、形式为:sizeof(类型名)sizeof 运算符的结果以字节为单位显示,float num; sizeof(num);4,64,运算符优先级,当我们遇到一个复杂表达式时,需要确定先执行哪种运算,此时就需要考虑运算符的优先级 z = x + y g * h * (t/20)+ 65 r % 26 3 & 5 | 8 3 - !2,65,运算符优先级,66,例6 3 & 5 | 8 3 - !2,0,3 - 0,8 3,1,0,1 & 5,1 | 0,1,2006-9,1、下列定义变量的语句中错误的是A int _int; B double int_;C char For; D float US
24、$; 2、若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是A +x,y=x- B x+1=yC x=x+10=x+y D Double(x)/10 3、以下关于逻辑运算符两侧运算对象的叙述中正确的是A 只能是整数0或1 B 只能是整数0或非0整数C 可以是结构体类型的数据 D 可以是任意合法的表达式 4、若有定义int x,y ; 并以正确给变量赋值,则以下选项中与表达式 (x-y)?(x+): ( y+)中的条件表达式(x-y) 等价的是A (x-y)0 ) B (x-y)0) D (x-y)=0 ),2006-9,5、有以下程序main( ) int x,y,z; x=y=1;
25、z=x+,y+,+y; printf(“%d,%d,%dn“, x,y,z); A 2, 3, 3 B 2, 3, 2 C 2, 3,1 D 2, 2, 1 6、有以下程序main( ) int a=0,b=0;a=10; /* 给a赋值b=20; 给b赋值 */printf(“a+b=%dn“, a+b); /* 输出计算结果 */ A a+b=10 B a+b=30 C 30 D 出错 7、以下选项中,值为1的表达式是A 1-0 B 1-0 C 1-0 D 0-0,因为赋值运算符比逗号运算符优先级高 (z=x+),(y+),(+y);,2006-9,8、设有定义:float x=123.4
26、567;,则执行以下语句的输出结果是( )printf(“%fn“, (int)(x*100+0.5)/100.0); 9、以下程序运行后的输出结果是( )main( ) int m=011, n=11;printf(“%d %dn“, +m, n+); 10、以下程序运行后的输出结果是( )main( ) int x,a=1,b=2,c=3,d=4;x=(ax)?x:d;printf(“%dn“, x); ,123.460000,10 11,1,2007-4,1、若有代数式以下正确表示该代数式的C语言表达式是A sqrt(abs(nx+ex) B sqrt(fabs(pow(n,x)+pow
27、(x,e)C sqrt(fabs(pow(n,x)+exp(x) D sqrt(fabs(pow(x,n)+exp(x) 2、设有定义:int k=0; 以下选项的四个表达式中与其他三个表达式的值不相同的是A k+ B k+=1C +k D k+1 3、有以下程序,其中%u表示按无符号整数输出main()unsigned int x=0xFFFF; printf(“%un“,x) ;程序运行后的输出结果是A -1 B 65535 C 32767 D 0xFFFF 4、以下选项中,当x为大于1的奇数时,值为0的表达式是A x%2=1 B x/2C x%2!=0 D x%2=0,注意:考虑的是表达
28、式的值,不是变量k的值,2007-4,5、以下合法的字符型常量是A x13 B 081 C 65 D “n“ 6、已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是A c=(c-A)%26+a B c=c+32C c=c-A+a D c=(A+c)%26-a 7、执行以下程序后的输出结果是main()int a=10; a=(3*5,a+4); printf(“a=%dn“,a) ; 8、以下程序后的输出结果是#include main()printf(“%dn“,strlen(“IBMn0121“);,a=14,9,20
29、07-9,1. 以下选项中,合法的一组C语言数值常量是A) 028 B) 12. C) .177 D) 0x8A.5e-3 0Xa23 4e1.5 10,000.0xf 4.5e0 0abc 3.e5 2. 以下关于long、int和short类型数据占用内存大小的叙述中正确的是A)均占4个字节 B) 根据数据的大小来决定所占内存的字节数C)由用户自己定义 D) 由C语言编译系统决定 3. 若变量均已正确定义并赋值,以下合法的C语言赋值语句是A) x=y=5; B)x=n%2.5; C)x+n=I; D)x=5=4+1; 4. 设有条件表达式:(EXP)?i+;j-,则以下表达式中(EXP)完
30、全等价的是A)(EXP=0) B) (EXP!=0) C)(EXP=1) D)(EXP!=1),2007-9,5. 已有定义:char c; ,程序前面已在命令行中包含ctype.h文件,不能用于判断c中的字符是否为大写字母的表达式是A) isupper(c) B) A=c=ZC) A=c后,输出结果是A) A,B B) A,68 C)65,66 D)65,68 7. 以下正确的字符串常量是A) “ B) abc C) OlympicGames D) “,2008-4,1. 以下选项中不属于字符常量的是 A) C B) “C“ C) xCC D) 072 2. 设变量已经正确定义并赋值,以下正
31、确的表达式是 A) x=y*5=x+z B) int(15.8%5) C) x=y+z*5,+y D) x=25%5.0 3. 已知字母A的ASCII代码值为65,若变量kk为char型,以下不能正确判断出kk中的值为大写字母的表达式是 A) kk=A&kk=A|kk=a&(kk+32)=z D) isalpha(kk)&(kk91),2008-4,4. 当变量c的值不为2,4,6时,值也为“真”的表达式是 A)(c=2)|(c=4)|(c=6) B)(c=2后b的值为【6】。 6. 设变量已经正确定义为整型,则表达式n=i=2,+i,i+的值为【7】。,0,3,2008-9,1. 以下选项中
32、不能作为C语言合法常量的是 A) cd B) 0.1e+6 C) “a“ D) 011 2.以下选项中正确的定义语句是 A) double a;b; B) double a=b=7; C) double a=7,b=7; D) double,a,b; 3.以下不能正确表示代数式2ab/cd的C语言表达式是 A) 2*a*b/c/d B) a*b/c/d*2 C) a/c/d*b*2 D) 2*a*b/c*d 4.C源程序中不能表示的数制是 A) 二进制 B) 八进制 C) 十进制 D) 十六进制,2008-9,5.若有表达式(w)?(-x):(+y),则其中与w等价的表达式是 A w=1 B
33、w=0 C w!=1 D w!=0 6. 执行以下程序段后,w的值为int w=A,x=14,y=15;w=(x|y) A -1 B NULL C 1 D 0,2009-3,1.以下选项中合法的标识符是: A) 1_1 B) 1-1 C) _11 D) 1_ _ 2. 若函数中有定义语句:int k; 则 :A) 系统将自动给k赋初值 B) 这时k中的值无定义 C) 系统将自动给k赋初值-1 D) 这时k中无任何值 3. 以下选项中,能用作数据常量的是:A)o115 B)0118 C).5e1.5 D) 115L 4.设有定义:int x=2;, 以下表达式中,值不为6的是: A) x*=x+
34、1 B) x+,2*x C) x*=(1+x) D) 2*x,x+=2,2009-9,1.以下选项中合法的标识符是: A) void B) 8_8 C) _0_ D) unsigned 2. 表达式 (int)(double)9/2)-(9)%2的值是:A) 0 B) 3 C) 4 D) 5 3.设有定义:int x=10;, 则表达式x-=x+x的值是:A) -20 B) -10 C) 0 D) 10,2010-3,1.若有定义:double a=22;int i=0,k=18;则不符合C语言规定的赋值语句的是( ) A a=a+,i+; B i=(a+k)=(i+k); C. i=a%11
35、; D i=!a; 2.以下关于C语言数据类型使用的叙述中正确的是 A 若要准确无误差的表示自然数,应使用整数类型 B 若要保存带有多位小数的数据,应使用双精度类型 C 如要处理如“人员”信息等含有不同类型的相关数据,应自定义结构体类型 D .若只处理“真”和“假”两种逻辑值,应使用逻辑类型 3.若a是数值类型,则逻辑表达式(a=1)|(a!=1)的值是 1 B 0 C 2 D 不知道a的值,不能确定 4.设x为int型变量,请写出一个关系表达式( ),用以判断x同时为3和7的倍数时,关系表达式的值为真,x%3=0 & x%7= =0,2011-3,(11)计算机高级语言程序的运行方法有编译执
36、行和解释执行两种,以下叙述中正确的是( ) 。 A)C 语言程序仅可以编译执行 B)C 语言程序仅可以解释执行 C)C 语言程序既可以编译执行又可以解释执行 D)以上说法都不对 (12)以下叙述中错误的是( ) 。 A)C 语言的可执行程序是由一系列机器指令构成的 B)用 C 语言编写的源程序不能直接在计算机上运行 C)通过编译得到的二进制目标程序需要连接才可以运行 D)在没有安装 C 语言集成开发环境的机器上不能运行 C 源程序生成的.exe 文件,2011-3,(13)以下选项中不能用作 C 程序合法常量的是( ) 。 A)1,234 B)123 C)123 D)“x7G“ (14)以下选
37、项中可用作 C 程序合法实数的是( ) 。 A).1e0 B)3.0e0.2 C)E9 D)9.12E (15)若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是( ) 。 A)a=(b=4)=3; B)a=b=c+1; C)a=(b=4)+c; D)a=1+(b=c=4);,课后作业,认真复习本讲内容,理解记忆相关的概念和计算规则。 从键盘输入两个数字,在屏幕上输出这两个数字的加、减、乘、除的结果。 编写程序,首先给出a的值,输出a+,+a,思考两者的区别。,84,题盘练习,例题:18-3。两位数分离数字的方法,利用运算符/及%。(2) 课后作业:33-3;34-3;64-3;65-3;72-3;95-3;97-3注意:掌握两个数的输入方法!,