资源预览内容
第1页 / 共120页
第2页 / 共120页
第3页 / 共120页
第4页 / 共120页
第5页 / 共120页
第6页 / 共120页
第7页 / 共120页
第8页 / 共120页
第9页 / 共120页
第10页 / 共120页
亲,该文档总共120页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,第3章 基本运算与输入输出,2,主要内容,3.1 运算符与表达式概述 3.2 数据对象的存取 3.3 基本数值运算 3.4 其他常用运算 3.5 输入与输出,3,3.1 运算符与表达式概述,3.1.1 运算符 3.1.2 表达式,4,3.1.1 运算符,1.算术运算符 + - * / % 2.关系运算符 = | & 5.赋值运算符 = 及其扩展赋值运算符 6.条件运算符 ? : 7.逗号运算符 , 8.指针运算符 * & 9.求字节数运算符 sizeof 10.强制类型转换运算符 (类型) 11.分量运算符 . 12.下标运算符 13.其他 如函数调用运算符(),C运算符种类,5,3.1.1 运算符,按照运算符其要求的运算对象的个数分类: &a (单目运算符) a+b (双目运算符) a?b:c (三目运算符),6,3.1.2 表达式,什么是表达式? 所谓表达式(expression)是指利用运算符(operator)和圆括号将操作数(operand)按C语言规定的语法规则连接起来的计算式。 表达式的组成(运算符,操作数,括号),7,3.1.2 表达式,表达式的形式 简单表达式, 例 a、abs(x)、(a+b)、ai 、a.x 混合表达式 ,例 a*b+4/(c+d) 常量表达式, 例 3+4-a 左值表达式 所谓左值表达式是产生一个“数据对象”的表达式。 一个“数据对象”可理解成一个可以处理或存取的存储区域及其中的值。 例 a,ai,8,3.1.2 表达式,表达式的值与类型 运算符的优先级 运算符的结合性 表达式的求值顺序 按C99标准,除包含顺序点(sequence point)的表达式求值时有严格要求外,表达式的子表达式间的计算顺序并不确定,允许编译程序自由安排表达式的计算顺序,由此产生最优代码。 3+4+5*6,9,3.1.2 表达式,顺序点: 在表达式的求值过程中的某一点,该点前面的运算在进入下一步前都已被计算完成。 &、|、?:、逗号运算符等第一个左操作数的结尾处 每个完整表达式的结束点 函数调用中进入函数体之前的所有实参等求值完成后,10,3.2 数据对象的存取,3.2.1间接引用运算与间接引用数据对象 3.2.2 赋值运算与赋值表达式,11,3.2.1间接引用运算与间接引用数据对象,数据对象 数据对象的存和取 数据对象的直接引用 例:a 数据对象的间接引用 例:*p 取地址运算 & (左值对象) 间接引用运算符 *,几个概念,12,3.2.2 赋值运算与赋值表达式,赋值表达式: V = E 作用:计算右部表达式E的结果赋给左部变量。 如: a = 3+k*u 执行一次赋值操作(或称赋值运算), 把3与k*u的和作为变量a的值。 执行过程: 确定左部变量V的类型 计算右部表达式E 将的结果按的类型转换后,送入左部变 量V中。,赋值运算,13,3.2.2 赋值运算与赋值表达式,赋值表达式的功能是:将赋值运算符右侧的“表达式”的值赋给左侧的变量。 赋值表达式的值就是左部变量的值 例如,“a=5” 的值为5(变量a的值也是5)。 赋值表达式的类型就是左部变量的类型,赋值运算,14,3.2.2 赋值运算与赋值表达式,赋值运算符对左操作数有左值(Lvalue)要求 a=1和a+1=2的正确性 赋值运算右部的“表达式”又可以是一个赋值表达式,从而可有:a=(b=5) 赋值运算类型不一致时系统作类型转换,15,3.2.2 赋值运算与赋值表达式,int a; float b=7.5; a=b+5; 思考: 变量a运算后的值和类型? 类型按照何种规律转换?(七规则),赋值数据的类型转换,16,3.2.2 赋值运算与赋值表达式,整型数据赋给相同宽度的整型左值对象 unsigned char型char型 unsigned int型int型 unsigned long int型long int型 short型unsigned short型 原则:数据在内存中的实际存储形式原样赋值,按左边对象类型解释赋值后的数据,赋值数据的类型规则(1),17,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) unsigned int i=40000; int j; j=i; printf(“%dn”,j);,赋值数据的类型规则(1),18,3.2.2 赋值运算与赋值表达式,较长的整型数据赋给较短的整型左值对象 int型char型 short int型char型 long int型unsigned int型 unsigned long int型int型 原则:从较长数据的低位部分截出宽度较短数据的二进制位数赋给较短的左值数据对象,根据短宽度变量的类型计算其实际值,赋值数据的类型规则(2),19,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) int i=3873; char c; c=i; printf(“%cn”,c); ,赋值数据的类型规则(2),20,3.2.2 赋值运算与赋值表达式,较短的整型数赋给较长的整型左值对象 char型int型 unsigned char型short int型 unsigned int型unsigned long int型 int型unsigned long int型 原则:扩展较短整型数的表示位数,赋值数据的类型规则(3),21,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) unsigned int u=40000; long int j; j=u; printf(“%ldn”,j); ,如果较短的整型数是无符号数,则不管赋值号左边的整型对象是否有符号一律补0,保持数值不变,赋值数据的类型规则(3),22,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) int i=-32768; long int j; j=i; printf(“%ldn”,j); ,如果较短的整型数是有符号数,则高位部分一律补上较短整型数符号位的值,赋值数据的类型规则(3),23,3.2.2 赋值运算与赋值表达式,浮点数赋给整型左值对象 float型int型 doule型int型 float型short int型 double型long int型 原则:浮点数赋给整型左值对象的赋值类型转换仅取浮点数整数部分,赋值数据的类型规则(4),24,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) int a; float b=123.456; a=b; printf(“a=%dn”,a); ,赋值数据的类型规则(4),25,3.2.2 赋值运算与赋值表达式,整型数赋给浮点型左值对象 int型float型 int型doule型 short int型float型 long int型double型 原则:将整型数转换成浮点数的形式赋给浮点型左值对象,赋值数据的类型规则(5),26,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) float a; int b=123; a=b; printf(“a=%fn”,a); ,赋值数据的类型规则(5),27,3.2.2 赋值运算与赋值表达式,较长的浮点数赋给较短的浮点型左值对象 double型float型 long double型doule型 long double型float型 原则:只保证赋给较短的浮点型左值对象对应的有效数字位数准确,赋值数据的类型规则(6),28,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) double x=123453212.789; float y; y=x; printf(“y=%fn”,y); ,赋值数据的类型规则(6),29,3.2.2 赋值运算与赋值表达式,较短的浮点数赋给较长的浮点型左值对象 float型double型 double型long doule型 float型long double型 原则:将按较长的浮点型左值对象空间的大小重新表示较短的浮点数,有效数字位数扩展到较长浮点型左值对象的有效位个数,赋值数据的类型规则(7),30,3.2.2 赋值运算与赋值表达式,#include /*假设在16位编译环境运行 */ int main(void) float x=1234.123; double y; y=x; printf(“y=%lfn”,y); ,赋值数据的类型规则(7),31,3.2.2 赋值运算与赋值表达式,尽量避免有符号数和无符号数之间的转换 尽量避免较长宽度的数据赋值给较短宽度的左值对象 明确数据范围,避免溢出,赋值数据类型转换的注意点:,32,3.2.2 赋值运算与赋值表达式,表示形式 V1=V2=V3=V4=E Vi的要求 计算顺序 类型转换,嵌套的赋值运算,33,3.2.2 赋值运算与赋值表达式,表示形式 a=a+b a+=b 优点 允许复合的运算符 +=、-=、*=、/=、%= =、&=、=、|= 对象的要求,复合的赋值运算,34,3.3 基本数值运算,3.3.1 算术运算符 3.3.2 算术表达式 求值中的类型转换问题 求值正确性问题 3.3.3 数学库函数 3.3.4 数值计算中的溢出和误差问题,35,3.3.1 算术运算符,36,3.3.1 算术运算符,+、-、*、/ 5/3=? 5.0/3=? %(取模运算符) -7%2=? 分离数的各位数字,如123,基本算术运算符,37,3.3.1 算术运算符,+和-的作用 a+和+a,a-和-a的区别 例:int a=3,b,c,d,e; b=a+; /* a=? b=? */ c=a-; /* a=? c=? */ d=+a; /* a=? d=? */ e=-a; /* a=? e=? */ 如何理解a+b这样的表达式? 5+,(a+b)+,+-a,-+a,-a+是否正确?,自增自减运算符,38,3.3.2 算术表达式,什么是算术表达式? 算术表达式的操作数范畴和类型是什么? 例:a+1.5*c-e 算术表达式的求值顺序及()的作用 例1:a+b*c 例2:a-(b+10)*c 例3:a+b*c*d,39,3.3.2 算术表达式,如果参与运算的两个操作数类型相同,则直接计算,运算结果的类型不变 例:3+4, 3/4 如果参与运算的两个操作数类型不同,则系统自动提升较低类型操作数为较高类型操作数,运算结果为较高类型。几个原则: 浮点数类型高,整型数类型低 相同存储长度时无符号整型高,有符号整型低 存储空间越大级别越低,算术表达式求值过程中的类型转换(1),40,3.3.2 算术表达式,a.表达式中的char 和short型操作数总被提升为int; b.在有些系统中,float总被提升为double(如在Turbo C中),而有些系统则不是(如在Dev C+中)。因此,float如何提升与系统有关 c.类型提升不是逐级进行,而是将参与运算的两个操作数中较低类型的操作数直接提升成另一个较高操作数的类型; d.数据类型提升是由系统自动进行的,只是产生一个临时的数据参与运算,并不改变操作数本身的类型,算术表达式求值过程中的类型转换(2),41,3.3.2 算术表达式,cha
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号