1、第3章 数据类型、运算符与表达式,数据类型 常量与变量 整型数据 实型数据 字符型数据,变量赋初值 各类数值型数据间的混合运算 算术运算符和算术表达式 赋值运算符和赋值表达式 逗号运算符和逗号表达式,回顾,程序是为执行一项任务而编写的有序指令集 算法是解决问题的具体方法和步骤 流程图是算法的图形化表现形式 C语言的特点 C程序的编译和运行过程 编译器将源程序转换成机器能理解的程序 连接器用于连接相关的目标文件以生成可执行程序,目标,理解变量和常量的含义 熟悉基本数据类型 - int、char、float 和 double 使用算术运算符 理解类型转换 熟练掌握自增和自减运算 熟练掌握复合赋值表
2、达式,一C的数据类型,(一) 什么是数据类型? (二) C语言的数据类型有哪些?,(一) 什么是数据类型?,数据结构+算法=程序,C语言中以 “数据类型”形式存在,对数据的描述,对操作的描述,3.1 C的数据类型,指针类型,空类型void,定义类型typedef,数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作,返回,基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例,-21474836482147483647,04294967295,(一) 常 量 (二) 变 量,3.2 常量与变量,概念,在程序
3、运行过程中,其值不能被改变的量。,分类,字面常量(直接常量): 12 -44.6 a “Hello! “ 符号常量:用一个标识符代表一个常量。,字符串常量,符号常量的定义,格式:#define 常量名 字面常量 举例:#define PRICE 100#define PI 3.14#define C1 a,习惯上常量名用大写, 变量名用小写。,意义,1、含义清楚。 2、在需要改变一个常量时,能够做到“一改全改”。,符号常量的定义放在 函数外面。,(一) 常量,符号常量使用,#define PRICE 30 main() int num,total;num=10;total=num*PRICE;
4、printf(“total=%d“,total); ,运行结果:total=300,符号常量的使用能给程序员带来哪些好处?,单价符号常量,概念,其值可以改变的量称为变量。,(二)变量,要素,(1)变量名。每个变量都必须有一个名字变量名,变量命名遵循标识符命名规则。 (2)变量值。在程序运行过程中,变量值存储在内存中。在程序中,通过变量名来引用变量的值。,标识符 identifier,1、标识符就是一个名字(如常量名、变量名、函数名)。2、组成:只能由字母、数字、下划线组成。且第一个字符必须为字母或下划线。3、长度:标识符的有效长度随系统而异,如果超长,则超长部分被舍弃。VC+6.0中规定最大长
5、度为247个字符。4、标识符命名的良好习惯见名知意,标识符命名实例:stu_name, sum, total, day, count, sort,标识符只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字,讨论:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab above $123 _toDay,M.D.John,3days,#33,char,$123,ab,返回,变量定义,数据类型 变量名, 变量名2;,习惯上,变量名用小写字母。 常量名用大写字
6、母。,方式: 1、定义变量的同时赋初值(也叫变量初始化)。格式:数据类型 变量名=初值, 变量名2=初值2; 2、通过一个赋值语句给变量赋初值。格式 :变量名=初值;,变量赋初值,出现在函数体 的声明部分,出现在函数体 的执行部分,int a,b=3;,int a,b; b=3;,变量的使用:作强制定义,也就是“先定义,后使用”,例1 int student;stadent=19; /Undefined symbol stadent in function main,例2 float a,b,c;c=a%b; /Illegal use of floating point in function
7、 main,变量,程序,编写程序时,常常需要将数据存储在内存中,方便后面使用这个数据或者修改这个数据的值。,通常使用变量来存储数据。使用变量可以引用存储在内存中的数据,并随时根据需要显示数据或执行数据操纵。,存储 Rate,Rate * 5%,将值存储为DiscAmt,Rate-DiscAmt,10,0.5,将值存储为Result,9.5,声明和使用变量,声明变量: Datatype variablename; 定义时初始化变量: Datatype variablename = value; 定义后初始化变量: variablename = value;,给变量赋值,除了给一个直接的值以外,还
8、可以通过计算获得。,变量命名,在 C 语言中,变量命名需要遵循一定的规则,有效名称,principal,cost_price,marks_3,lastname,city,无效名称,123rate,currency$,discount%,zip code,变量的命名规则: 变量名可以由字母、数字和 _(下划线)组合而成 变量名不能包含除 _ 以外的任何特殊字符,如:%、# 、逗号、空格等 变量名必须以字母或 _(下划线)开头 变量名不能包含空白字符(换行符、空格和制表符称为空白字符) C 语言中的某些词(例如 int 和 float 等)称为保留字,具有特殊意义,不能用作变量名 C 语言区分大小
9、写,因此变量 price 与变量 PRICE 是两个不同的变量,变量举例,include void main() int student,age;int if=adrress=1;float score=90;stadent=2;Age=20.7;printf(“%d %d %d %f“,if,student,age,score); ,本程序中有几处错误?,undeclared identifier,(一) 整数类型 (二) 实数类型 (三) 字符类型 (四) 不同类型数据间的转换,四、基本数据类型,整型数据 整型常量,问题: 0123 = ( )10 0x123 = ( )10 0Xff =
10、 ( )10,3.3 整型数据,返回,整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量,例 12 与 12L,整型变量 整型变量在内存中以二进制的形式存放 根据占用的字节数不同,分为不同类别,整型变量的定义,整型变量定义举例:int a,b;unsigned short c,d;long e, f;,例: main() int a,b,c,d;unsigned u;a=12; b=-24; u=10;c=a+u; d=b+u;printf(“a+u = %d, b+u = %dn”,c, d); ,运行结果:a+u = 22, b+u =
11、 -14,整型数据在内存中是以补码表示的。(参见教材P41),整数类型存储方式,例如: 求-10的补码表示(假如按16位存储)。,-10的原码,1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0,除符号位外各位取反,1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1,末位加1,1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0,则得到-10的二进制补码的表示。,整数类型溢出举例(P21-例2.2),#include void main() int a,b;a=2147483647;b=a+1;printf(“%d,%d“,a,b); ,运行结果,改为2147
12、483646,2147483646 2147483647,运行结果,2147483647 -2147483648,实型数据 实型常量 表示形式:十进制数形式:(必须有小数点)指数形式:(e或E之前必须有数字;指数必须为整数) 实型常量的整数部分为时可以省略,且E或e后面指数必须为整数。,十进制数形式实型常量 0.123, .123, 123.0, 0.0, 123.,指数形式实型常量 12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5 , .e3,3.4 实型数据,返回,实型数据 实型常量 规范化的指数形式:即在字母e(或)之前的数据部分中,小数点左边有 且仅有一位非
13、零的数字。,指数形式实型常量 12.3e3 ,123E2, 1.23e4 , 0.123e-3,实型常量的类型实型常量部分float和double型,一个实型常量可以赋给一个float型或double型变量。根据变量的类型截取实型常量中相应的有效数字。,实型变量 float: 占4字节,提供7位有效数字 double:占8字节,提供1516位有效数字,基本数据类型,数据属于不同类别,Africa,The quick brown fox,TRUE,数据,非数值,数值,整型,非整型,9002.12,999,9/12/2003,2.175,123,Jackie Chan,char,数据类型,非数值,
14、数值,整型,int,short int,long int,double,float,非整型,3.5 字符型数据,字符常量 字符变量 字符串常量,返回,字符常量 定义:用单引号括起来的单个普通字符或转义字符。 字符常量的值:该字符的ASCII码值 转义字符:反斜线后面跟一个字符或一个代码值表示,如 a A ? n 101,如 A65, a97,048 , n10,如 101 -A 012 -n376 - x61 -a60 -0 483 -(),例: A-101-x41-65,例 转义字符举例(ch2_001.c,ch2_004.c) main() printf(“101 x42 Cn“);pri
15、ntf(“I say:“How are you?“n“);printf(“C Programn“);printf(“Turbo C“); ,运行结果:(屏幕显示) A B C Isay:”How are you?” C Program Turbo C,例 main() printf(“Yb=n”);,运行结果: 屏幕显示:= 打印机输出:,注意事项: 单撇号中的字符不能是或者 一个字符占一个字节,存其对应的ASCII码 思考:9和9的区别 字符型数据可像证书一样在程序中参与相关的运算,a 32 结果为65,字符变量 字符变量存放字符ASCII码 char与int数据间可进行算术运算,例1 a=
16、D; /* a=68; */x=A+5; /* x=65+5;*/s=!+G /* s=33+71;*/,例2 字符变量的字符形式输出和整数形式输出。 #include void main() char ch1,ch2; ch1=a; ch2=b;printf(“ch1=%c,ch2=%cn“,ch1,ch2); printf(“ch1=%d,ch2=%dn“,ch1,ch2); ,字符类型举例2,一个字符型数据,既可以字符形式输出,也可以整数形式输出,ch1=a,ch2=b ch1=97,ch2=98,程序运行结果:,/*ch2_003.c*/ #define PRICE 12.5main(
17、) int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%f,ch1=%cn”,total,ch1);,运行结果: total=37.500000, ch1=d,例子,字符串常量 定义:用双引号(“”)括起来的字符序列 存储:每个字符串尾自动加一个 0 作为字符串结束标志 字符常量与字符串常量不同,例: char ch;ch=“A”;,没有字符串变量,用字符数组存放,思考?,1、 字符串常量“How do you do.“和“Good morning.“的长度分别是多少?,2、 字符串C:
18、msdosv6.22和I say: “ Goodbye! “在C语言中的字符串常量形式如何表示?,3、 字符串“CHINA“在内存中的实际存储形式是怎样的?占用多少个字节的内存空间?,14和13,“C:msdosv6.22“和“I say:“Goodbye!“,占用字节而非字节内存空间,总结:字符与字符串的区别有哪些?,定界符不同:字符常量使用单引号,而字符串常量使用双引号; 长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数; 存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志0。,3.7 各类数值型数
19、据间的混合运算,隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换,a 32,int age; age = 11.1,char name=a; printf(“%dn”,name);,返回,运算转换规则:不同类型数据运算时先自动转换成同一类型。,1、纵向向上的箭头表示不同类型的转换方向(由低类型转化为高类型),不表示转换所经的步骤。2、横向向左的箭头表示必须的转换。,int i; float f; double d; long e; i=2; f=2.5; d=3
20、.9; e=3; ,10+a+i*f-d/e,int,double,double,double,double,思考:根据已知变量定义及赋值语句,计算以下表达式的值,并说明每一步所得结果的数据类型。,char ch;int i;float f;double d;,ch/i + f*d - (f+i),例,显示转换可以利用强制类型转换将一个表达式转换成所需类型 一般形式:(类型名)(表达式) 例: (int)(x+y)(int)x+y(double)(3/2)(int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main() float x;int i;x=3.6;i=(in
21、t)x;printf(“x=%f,i=%d”,x,i);,精度损失问题,结果:x=3.600000,i=3,#include void main() float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d“,x,i); ,思考:以下程序的输出结果是什么?,x=3.600000,i=3,程序运行结果:,结论:较高类型向较低类型转换时可能发生精度损失问题,举例:已知三角形的边长a、b、c,求三角形周长的一半。,#include void main() float a,b,c,s;a=3;b=4;c=5;s=1/2 * (a+b+c);printf(“s=%8.
22、2f“,s); ,s= 0.00,程序运行结果:,?,s= 6.00,程序运行结果:,改为:1.0/2 (1/2.0) 或 (float)1/2 (1/(float)2),3.8 算术运算符和算术表达式,C运算符简介,学习运算符应注意运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型,返回,基本的算术运算符 + 加法运算或正值运算符 - 减法运算或负值运算符 * 乘法运算符 / 除法运算符,求商,两个整数相除结果为整数 % 模运算符,求余,要求两则均为整型数据,3+5、+3,5-2、-3,3*5,5/3,7%4,算术运算符和算术表达式,基本算术运算符,+ - *
23、 / %,说明,例: 5/3=1 -5/3=-1,模运算符或求余运算符,算术表达式,用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子。,优先级和结合性,先乘除、后加减,有括号先算括号。 自左至右,常量、变量、函数等,说明,如果一个运算符两侧的数据类型不同,先自动进行类型转换,使二者具有同一类型,然后进行运算。,两个整数相除的结果为整数,舍去小数部分。 当商为负数时,多采用“向零取整”的方法。,求余运算的两侧均应为整数 例:5%3=2,例: a*b/c-1.5+a,例 5/2 =-5/2.0 =,例 5%2 =-5%2 =5%-2 =1%10 =5%1 =5.5%2,2
24、,-2.5,1,-1,1,0,(),1,取模的余数符号由分子(被除数决定),自增、自减运算符,作用:自增运算符()使单个变量的值增1;自减运算符()使单个变量的值减1。,例,i=3; A) j=+i; j=i+; j=-i+;,i=i+1,i=i-1,? j,i,A) j=4 i=4 j=3 i=4 j=-3 i=4,格式: 前置:+i , -i (在使用i之前,使i的值加(减)1)后置:i+ , i- (在使用i之后,使i的值加(减)1),+和-结合方向 是“自右至左”,例,i=3; A) c=(i+)+(i+); B) a=i+; b=i+;c=a+b;,? c, i,A) c=6 i=5
25、 B) c=7 i=5,两处i值都为3,例,自左而右组合,例 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,/4,/3,/c=20,a=4,/c=15,a=4,自增、自减运算符,注意说明: 只能用于变量,不能用于常量或表达式; 结合方向“自右向左”; 优先级别: - - + - - * / % - + - 自增(减)运算常用于循环语句中循环变量自动加(减)1或指针变量,使指针指向下一个地址 表达式中包含
26、多个自加、自减运算时,很容易出错,5+ () (a+b)+ () i+ (),例1解答: -i+ -(i+)i=3; printf(“%d”,-i+); /-3,例1: -i+i=3; printf(“%d”,-i+);,i+j,应如何结合?调用函数时,实参数地求值顺序,c并无统一规定,3.9 赋值运算符和赋值表达式,简单赋值运算符“” 作用:将一个数据赋给一个变量,常量或表达式,只能是变量,不能是常量或表达式,例 3=x-2*y; a+b=3;,例 a3;a(a+b)*c,返回,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例1 float f; int i;i=10; f=
27、i;则 f=10.0,例2 int i; i=2.56; /结果i=2;,结合方向:自右向左优先级: 14,例: a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/ b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,复合的赋值运算符+= -= *= /= %= = &= = |=,赋值表达式 定义:由赋值运算符将一个变量和一个表达式连接起来的式子,叫赋值表达式。 一般形式: 赋值表达式的值与变量值相等,且可嵌套,例: a=12
28、; 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+(a=a*(a=a-(a=a*3),3.10 逗号运算符和逗号表达式,形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值,返回,例1 a=3*5,a*4a=3*5,a*4,a+5 例2 x=(a=3,6*3)x=a=3,6*a 例3 a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c); 例4
29、 printf(“%d,%d,%d”,a,b,c) ;printf(“%d,%d,%d”,(a,b,c),b,c),/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,/其中逗号起分隔作用,/其中逗号为逗号运算符,总结 1,常量是在程序中不能被更改的值;而变量在程序中可以被更改的,通过变量可以引用存储在内存中的数据; C语言中的基本数据类型包括整型、单精度浮点型、双精度浮点型和字符型; 整型分为短整型、整型、长整型,每种整型又可分为有符号型和无符号型;,总结 2,单精度浮点型和双精度浮点型变量可以存储实数,但双精度型取值范围要比单精度型大的多; 字符型变量可以存储单个字符,其值是该字符的ASCII 码; 算术运算符提供运算功能,包括+、-、*、/、%、+和-。,