计算机C语言-第三章.ppt_第1页
计算机C语言-第三章.ppt_第2页
计算机C语言-第三章.ppt_第3页
计算机C语言-第三章.ppt_第4页
计算机C语言-第三章.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四讲 C的数据类型 运算符 表达式 本章导读 程序 算法 数据结构 前者已知 从这一节开始 解决后者确定了数据类型 则就明白了它们在计算机的有效形式 取值范围 运算规则等接下去再去研究这些规则 这是我们的最终目标 数据与数据类型 程序设计语言的基本规则包括 常数变量运算符表达式函数 什么是语言规则 为什么要有这些规则 把自然语言描述问题的方式转换为C语言的形式表达给计算机 规则 常数 变量 函数 数据与数据类型 续 问题 常数3 5和3 6的存放空间是否相同 变量a如何表示 如何存放 计算机如何知道3 6和a之间的关系 和如何输入 如何存放 计算机如何识别 运算结果放在哪里 数据的描述数据的操作 规则 类型 运算符 计算机完成上述计算 首先要解决数据的输入和存放问题 编程应考虑的问题 1 数据的描述 定义数据类型 即加工处理的数据采取什么类型 2 动作的描述 通过语句实现 告诉计算机操作的步骤 3 1C的数据类型 C数据类型数据类型总表 数据类型决定 1 数据占内存字节数2 数据取值范围3 其上可进行的操作 运算规则 4 程序中所用的所有数据必须指定其类型 枚举类型enum 常量与变量3 2 1常量和符号常量常量 在程序执行过程中 数值始终保持不变的量 整型 5 26 0 012 0 xF实型 3 14 2 45 2 17e1字符 a 1 A 标识符 符号 例如 definepi3 14常量一般从其字面形式即可判别 因此不需要定义 直接常量 标识符 概念 就是用来标识变量名 符号常量名 函数名 类型名 文件名等的有效字符序列 简而言之 标识符就是我们自己起的一个名字 1 标识符只能由字母 数字和下划线三种字符组成 且第一个字符必须为字母或下划线 定义规则 如 1yearmonthstudent namesum0M D Jones 123 a3b ca b 2 在C语言中 大小写字母不等效 因此 a和A I和i Sum和sum 分别是两个不同的标识符 一般的 变量名 函数名用小写 常量符号用大写 3 标识符的长度 Student name student number TC允许32个 建议不超过8个 增加可移植性 4 用户自定义的标识符不能与保留字 关键字 同名 保留字 关键字 概念 就是具有特定含义的标识符 用户不能用来作自定义标识符 C语言中的关键字较少 由ANSI标准推荐的关键字有32个 1 与数据类型有关的 14 charintfloatdoublesignedunsignedshortlongvoidstructuniontypedefenumsizeof 3 与程序控制结构有关的 12 dowhileforifelseswitchcasedefaultgotocontinuebreakreturn 2 与存储类别有关的 autoexternregisterstatic 例T3 1 c definePRICE30 预处理命令 比如 include main intnum total num 10 total num PRICE printf total d total 输出 total 300问题 允许语句PRICE 20吗 为什么要用符号常量 符号常量 见名知意 程序中一改全改 输入方便标识符命名的良好习惯 见名知意 所谓 见名知意 是指 通过变量名就知道变量值的含义 通常应选择能表示数据含义的英文单词 或缩写 作变量名 或汉语拼音字头作变量名 例如 name xm 姓名 sex xb 性别 age nl 年龄 salary gz 工资 sum 变量 在程序运行过程中 其值可以改变的数据称为变量 有关变量的规定 变量通过变量名标识 变量名和内存中的存储单元相对应 编写程序时通过变量名来存 取存储单元 变量必须先定义 声明 后使用Why 变量名及变量值 256 12 为何要先声明后使用 1 编译时便于检查 student statent2 编译时便于告诉计算机分配相应的存储空间 空房间 3 编译时能进行有关运算的合法性检查 如a b 两边必须是整型数据 是求余运算符 1 变量名由字母A B Z a b z 数字0 1 9和下划线 组成 2 变量名的第一个字符必须是英文字母或下横线 3 不能用系统中的关键字作为变量名4 变量名中的字母是区分大小写的 sum stu name age Lts 1 2 a232c x y start 9 c2 0NAMEname表示两个不同的标识符 变量名的规定 下面来看基本数据类型 重点和难点 整型数据表示数的范围实型数据的有效数字 精度 字符和字符串的区别转义字符的概念 3 3整型数据3 3 1整型常量表示方法1 十进制整数 如29 36 02 八进制整数 以0开头 后跟0 7中的若干数字 如 0123 83 103 十六进整制 以0 x开头 后跟0 9 A B C D E F 可小写 中的若干字符 如0 xA2 162 10 整型 整型数据包括整型常量和整型变量 整型数据以二进制补码形式存储 3 3 2整型变量1 整型变量在内存中的存放形式数据在内存中是以二进制补码形式存放的 2字节 符号位 例 inti j 空房间 i 10 j 10 整型变量的定义 例如 inti j longk m unsignedintx y 变量有值吗 C中的所有变量必须先定义后使用 格式 类型说明符变量列表 2 整型变量的分类根据数值的范围可定义以下类型的变量 1 基本型 用int定义2 短整型 用shortint或short定义3 长整型 用longint或long定义整 unsignedint4 无符号型 短整 unsignedshort长整 unsignedlong注 有符号型是signed 为系统默认值 因此一般缺省 0 正 1 负 无符号数据的特点 最高位不是作为符号位 而是作为存放有效数值本身 只能存放正数 为什么要定义无符号型的 例 inta a的数值范围为 32768 32767 unsignedintb b的数值范围为0 65535 无符号型整数变量中绝对不能存放有符号整数 ANSI定义的整数类型 取决于字长 类型比特数取值范围int16 32768 32767short16 32768 32767long32 2147483648 2147483647unsignedint160 65535unsignedshort160 65535unsignedlong320 4294967297 以十进制数13为例 说明该数在内存中的存储情况其中 带符号数在内存中存储形式是 最左边一位 最高位 是符号位 正为0负为1不带符号的数在内存中的存储形式是 最左边一位 最高位 是数值的有效位特别提示 不要随便使用long型 intsortlong unsignedintunsignedsortunsignedlong 3 整型变量的定义变量类型定义的目的 让编译为其分配内存单元 变量的定义一般在函数开始的声明部分 也可以在分程序 中 若在分程序中定义 其作用域仅在分程序中有效 例T3 2 cmain inta b c d unsignedintu a 12 b 24 u 10 c a u d b u printf a u d b u d n c d 运算结果 由此可见 不同类型的整型数据可以进行混合运算问题1 u 12可以吗 2 a 123456可以吗 4 整型数据的溢出int型变量允许的最大值为32767 如果大于此数 将产生溢出例T3 3 c整型数据的溢出情况main inta b a 32767 b a 1 printf d d a b 运行结果 首先思考 为何上述存放形式表示 32768而非 32767 溢出计算小窍门 65535 31767 变量a是正整数的最大值 加1后赋给b 使数值有效位占据符号位 此种情况 编译系统不会报错 这要靠编程者把握 怎么办 3 3 3 整型常量的类型整型常量根据值大小默认类型 将整型常量赋给整型变量时 要考虑常量的大小和变量所能表示的数据范围 一个整数 其值在如下范围 1 32768 32767 int shortint longint 2 2147483648 2147483647 longint 3 对于非负数 如 0 65535 unsignedint unsignedshort0 4294967295 unsignedlong说明 1 常量中无unsigned类型的数 常量均为有符型 正整数可赋给unsigned变量 只要数值不超过范围 2 在整型常量后加l或L表示长整型常量 如 456L 用作33 在函数调用时 若被调用函数的形参是长整型变量 则要求主调函数的实参也是长整型数据 再次强调 整数 关心的是什么 3 4实型数据3 4 1实型常量的表示方法实数又称浮点数 回忆 定点数和浮点数以及在计算机中的存储方式 1 十进制形式的实数 由数字和小数点组成 如 3 14 0 26 0 0 326 45C规定 必须要有小数点如 123 123 123 0 0 0均合法2 指数形式的实数 由尾数部分 字母e或E 指数部分组成 如 48 62e 12 其中 48 62为尾数 12为指数e为基数10 它表示48 62 1012C规定 e的前面要有数字 e后面的指数要为整数 计算机中输出时 均以规范化的指数形式存储 即小数点的左边有且仅有一个非零数字 如 演示 1e3 1 8e 3 123e 6 0 1e 3e5 1e 3 2 e e 03 3 4 2实型变量1 实型数据在内存中的存放形式float型变量 32位 4字节 double型变量 64位 8字节 计算机中存储时 均以指数形式存储 且小数部分为最高位为非零的纯小数 如 实型变量的分类单精度 float 双精度 double 长双精度 longdouble 单精度实型数据 float 表数范围 十进制形式 7位有效位 指数形式 e 双精度实型数据 double 表数范围 十进制形式 16位有效位 指数形式 e 长双精度实型数据 longdouble 表示数据范围 十进制形式 19位有效位指数形式 e 强调 实数关心什么 3 实型数据的舍入误差 问题1 0 3 3 1 存储单元所限 有效位以外的数字将被舍去 可能有一些误差 例T3 4 cmain floata b longdoublec a 123456 789e5 b a 20 c 123456789 123456789e4923 printf a f nb f nc Lf n a b c 输出结果 a 12345678848 000000b 12345678848 000000c 1 234567891234567890000000000000000000000e 4931a的值比20大的多 a 20的理论值是12345678920 而有效位只有7位 因此 后面的数字是无意义的 3 4 3实型常量的类型1 未加说明 系统将实型常量作为双精度处理例 floatf f 2 45678 4532 65系统将两数按双精度运算 然后将乘积前7位赋给实型变量f 缺点 浪费系统资源 降低运算速度 解决的办法 在数的后面加f 如2 45678f 系统将其按单精度数运算 小问题 可以123f吗 2 实型常量可赋给float或double类型变量 只要不超过其取值范围即可 根据变量的类型截取其有效位 例T3 4 1 cmain floatf1 doublef2 f1 111111 111 f2 111111 11111 printf f1 f nf2 lf n f1 f2 输出结果 f1 111111 109375f2 111111 1111100000 3 5字符型数据3 5 1字符常量字符常量 用一对单引号括起的一个字符 如 a A 9 说明 1 字符常量的值是该字符在ASCII码中的码值 P374 2 a 和 A 是两个不同的字符常量 a 97 A 653 开头的字符序列称为特殊形式的字符常量 转义字符 特别提示 1 2 为什么要用8和16进制的表示方法 3 0 000ASCII为0表示空操作 用于字符串结尾 4 考点 128 例T3 5 cmain printf n printf ab c t de rf tg n printf h ti b bj k n 运行结果 fgdehj k提示 1 所以 t 是在输出 空格空格 空格 2 光标移至1 9 17 即使当前光标在第3列 也是移至9 而非3 8 11列 3 5 2字符变量字符变量 用于存放一个字符常量 字符变量的定义形式 char character 字符变量名如 charc1 c2 定义c1 c2字符型变量 占一个字节 c1 a c2 b 将字符常量 a b 赋给c1和c2 2 5 3字符数据在内存中的存储形式及使用方法字符常量 字符变量中 是其ASCII码值 存储形式与整型数相似 整 字符型数据之间可通用 例T3 6 cmain charc1 c2 c1 97 c2 98 等效于 printf c1 c c2 c n c1 c2 printf c1 d c2 d n c1 c2 运行结果 c1 a c2 bc1 97 c2 98特别注意 0 255 因为只占1字节 例T3 7 c大小写字母的转换main charc1 c2 c1 a c2 b c1 c1 32 c2 c2 32 printf c1 c c2 c n c1 c2 运行结果 c1 A c2 B提示 小写比大写ASCII码大32 例T3 7 1 c字符数据与整型数据之间可以相互赋值main inti charc c 97 i a printf c d n c c printf c d n i i 运行结果 a 97a 97字符数据占一个字节 TC将字符作为有符号数处理 当ASCII码值在128 255之间时 其最高位为1 占据了符号位 以数据输出时为负数 126 130 以字符输出时是对应的字符 以无符号数据输出时 也是其对应的数据 p374 技巧 130 126 例 T3 7 2 cmain charc1 376 unsignedcharc2 376 printf d c n c1 c1 printf d c n c2 c2 运行结果 2 254 请见P374 Charc1Unsignedc2 3 5 4字符串常量字符串常量 用一对双引号括起的字符序列 如 BEIJING CHINA 123 a 字符串使用的有关说明 字符串可出现在输出函数中 如 printf ThisisaCprogram n 2 若字符串为 CHINA 它在内存中的实际存储形式是 字符串在内存中存放时 系统自动加字符串结束符 0 该字符在ASCII码中的码值为0 是空操作符 即无动作 不显示 其长度是6 最后一个字符是 0 是系统自动加上的 不能人为加上此字符 它不显示 打印输出时也无任何动作 3 C中无字符串变量 字符串可以赋给字符数组 4 字符常量与字符串常量意义不同 如 charc1 c2 c1 a 可以c2 a 错误不能把字符串赋给字符型变量 放不下 3 6变量赋初值方法有 定义的同时给变量赋初值如 inta 3 floatb 3 1415 charc x 2 定义变量时 可以对其中的一部分变量赋初值如 inta 3 b c d 8 3 把同一个常量赋给多个变量时 最好分别进行 如 inta b c 3 而应写为 inta 3 b 3 c 3 4 初始化是在程序运行时 执行到本函数时赋以初值的 如 inta 3 相当于 inta a 3 3 7各类数值型数据间的混合运算在C语言中 整 实 字符型数据间可以混合运算10 a 1 5 8765 1234 b 一 不同类型的数据运算时 要转换成同一类型类型转换原则 低类型向高类型靠拢 横箭头为必转 纵箭头为有条件转换 转换以后进行运算 不同类型之间转换如下图所示 二 类型转换进一步说明1 当两数为float时 都要转换为double型2 一个为float型 一个为char型时 要转换为double型 3 一个为long型 一个为int型时 则将转换为long型例 T3 7 3 cmain floata doubleb a 10 a 1 5 8765 1234 b b 10 a 1 5 8765 1234 b printf a f b f n a b 运行结果 a 858873 562500 b 858873 593200 数据与数据类型 程序的任务是对数据进行处理 数据是程序处理的对象 而运算符是施加给这些数据的操作 数据和运算符是表达式的基本元素 3 8算术运算符和算术表达式3 8 1C运算符简介 p375 除控制语句 if while for 和输入 输出函数 大部分操作都作为运算符处理 1 算术运算符 2 关系运算符 5 赋值运算符 6 条件运算符 7 逗号运算符 8 指针运算符 9 求字节数运算符 sizeof10 强制类型转换运算符 类型 11 分量运算符 12 下标运算符 13 其它运算符 如函数调用 3 8 2算术运算符和算术表达式1 基本的算术运算符 加法或正值运算符 如 2 3 d 减法或负值运算符 如 8 3 c 乘法运算符 如 3 5 除法运算符 两侧可以是整或实型数据 求余运算符两侧必是整型数据 说明 1 两个整数相除结果为整数 取整 如5 3 1 若为负数 则向零取整 如 5 3 12 实数进行 结果为double 因为都必转成double 例T3 7 4 c整型数据除法运算main inta b c a 5 b 3 c a b printf c d n c 运算结果 c 1 例T3 7 6 c实型数据除法运算main floata b c a 5 b 3 c a b printf f n c 运算结果 1 666667说明 1 两个整数相除结果为整数 取整 如5 3 1 整数除法中一个数为负时 结果取整后向0靠拢 如 5 3 15 3 18 3 2 8 3 2 2 取余运算符两则必须是整型数据 余数与被除数同号如 29 4 7余 129 4 7余1 52 7 7余 352 7 7余3 例T3 7 5 c长整型数据运算main inta b longc a 30000 b 30000 c a b printf c ld n c 运算结果 c 5536C 60000 另外 4 3 1 4 3 0 1 333333 0111010100110000 a 0111010100110000 b 1110101001100000 结果 符号位 2 算术表达式和运算符的优先级与结合性算术表达式 用算术运算符及括号将运算对象 常量 变量 函数 连接起来的 符合C语言语法规则的式子 如 a b c 1 5 a 在C语言中 运算符共有15个优先级 其中算术运算符的优先级是 3级 4级 请见P375 376算术运算符的结合方向 从左向右 即左结合性如 a b c 算符优先级相同 结合性 从左向右a b c 算符 的优先级高于 若运算符两侧的运算对象类型不同时 低类型向高类型转换 3 强制类型转换运算符一般形式 类型名 表达式 如 double a将a转换为double型 int x y 将x y的值转换为整型 float 5 3 将5 3的值转换成单精度实型说明 1 int x y 与 int x y意义不同2 类型转换得一个中间值 原变量的类型没有发生变化 例T3 8 cmain floatx inti x 3 6 i int x printf x f i d n x i 运算结果 x 3 600000 i 3 例T3 8 1 cmain floata b c d inte f a 5 b 3 c a b d float 5 3 e int a 3 f int b 3 8 printf c f d f e d f d n c d e f 运算结果 c 1 666667 d 2 000000 e 1 f 6思考 程序运行期间 a b的值发生变化没有 为什么要强制转换 函数调用形参要与实参类型一致 floatx x 3 int x 3 4 自增 自减运算符 增1运算符 使变量值增1 减1运算符 使变量值减1 如 i i 在使用变量i之前 先使变量i加 减 1 i i 在使用变量i之后 使变量i值加 减 1 例T cmain inti j i 3 printf d i 先不看 j i printf i d j d n i j 运算结果 i 4 j 4 例T3 8 3 cmain inti j i 3 j i printf i d j d n i j 运算结果 i 4 j 3说明 1 运算符只能用于变量 而不能用于常量和表达式 如a b 5 x y 2 运算符的结合方向是从右向左 例T3 8 4 cmain inti i 3 printf i1 d n i printf i2 d n i 运算结果 i1 3 why 查看优先级 负号运算符和 同处2级 所以自右向左 因此 相当于 i 那怎么不是 4 因为 i 是个表达式 有变量i 运算符 所以是个表达式 该表达式的值一定等于3 所以 请搞清楚 表达式 i的值为4 表达式i 的值为3 只有做完了所有的工作 即本例中的在表达式 i 前加个负号运算符及printf后 在使i 1 并覆盖i i2 4例T3 8 5 cmain inti i 3 printf i1 d n i printf i2 d n i 运算结果 i1 4i2 4 5 有关表达式使用中的问题说明 1 要注重C中的运算符和表达式的求值顺序 设变量 inti 3 如表达式 i i i 此类表达式 系统的不同 求值顺序也有差异 如某系统的求值顺序是先求第一个 再求第二个最后求第三个子表达式 其结果是 3 4 5 12 最后i的值为6而在TurboC中却有所不同 3 3 3 9 最后i的值为6所以建议 i 3 a i b i c i d a b c 例T3 8 6 cmain inti 3 j 3 k q k i i i q j j j printf i d j d k d q d n i j k q 运算结果 i 6 j 6 k 9 q 18 若表达式中有多个先增1 减1 或后增1 减1 解决的方法 将同类的子表达式进行扫描归类 先算中间结果 再算最后结果 例T3 8 7 cmain inti j x y i 3 j 30 x i i i i y j j j j printf i d j d x d y d n i j x y 运算结果 i 7 j 26 x 20 y 112 2 在C语言中运算符的确定在由多个字符组成的表达式中 应尽可能多地从左向右将若干个字符组成一个运算符 如 i j其结合性是 i j而不是 i j 回顾一下 1 inta b c a 5 b 4 c a b 若c a b 呢 到底i 什么时候 继续 3 printf函数输出实参的顺序如 inti 3 printf d d n i i 有的系统按从左到右的顺序求值 输出结果是 3 3而TurboC是按从右到左顺序求值 输出结果是 4 3j i printf d d j i 3 4结论 不写别人甚至自己都看不懂的程序 也不写那些不知道系统会怎样运行的程序 请谨慎使用 i 是以一个完整的表达式算完了为 1操作标志的 i 同理 3 9赋值运算符和赋值表达式1 赋值运算符 是赋值号 也是赋值运算符功能 计算表达式 赋给左边的变量 赋值运算符有计算的功能 如 a 3 5 b x y a b不管原来什么值 执行赋值语句后 新值将取代旧值 2 类型转换变量类型不同时接收的数据有差异 当赋值运算符两侧的数据类型不一致时 在赋值时要进行类型转换 1 实型数据赋给整型变量时 舍去小数部分 如 inti i 3 56 结果i的值为3 2 整型数据赋给实型变量时 数值不值 但以浮点形式存放于内存 如 floata 23 先将23转换成23 00000 然后送a中 doubleb 23 先将23转换为23 00000000000000 然后送b中 3 double型数据赋给float变量截取前7位 应注意数值范围不能溢出如 doubled 123 45678e65 floatf f d 由于数据溢出 f将得到错误的值float数据赋给double变量时 数值不变 有效位扩展到16位 4 字符型数据赋给整型变量字符数据占一个字节 整型数据占两个字节 字符数据赋给整型变量有两种情况 无符号字符型数据赋给整型变量 将其存放在整型变量的低8位中 而高位以0补齐 T3 8 8 cmain inti unsignedcharc c 376 i c printf i d c d n i c 结果 i 254c 254 带符号的字符型数据赋给整型变量若最高位为0 正数 则整型变量高8位补0 若最高位为1 负数 则整型变量的高8位补1 符号扩展 以保持数值不变例T3 8 9 cmain inti charc c 376 i c printf i d c d n i c 运行结果 i 2 c 2 5 int short long型数据赋给char变量 将它们的低 位赋给char型变量 截断 例T3 8 10 cmain inti 289 charc c i printf i d c d c c d i c c 运算结果 i 289 c 33 c 6 将带符号的int赋给long时 int的16赋给long的低16位 正数补0 负数进行符号扩展 看例P53long型数据赋给int型变量 将long型数据的低16位赋给int型变量 截断 例T3 8 11 cmain inta longb 65544 a b printf a d b ld n a b 运算结果 a 8 b 65544 a 8 符号位 b 65544 7 unsignedint型数据赋给long型变量时 unsignedint型数据赋给long型变量 将其赋给long型变量的低16位 高16位补0例T3 8 12main unsignedinta 65535 longb b a printf a u b ld n a b 输出 a 65535 b 65535 若无符号数据赋给相同长度的带符号的变量时 则原样赋给 unsignedint intunsignedshort shortintunsignedlong longint要注意数据的有效位占据符号位 即注意取值范围 例T3 8 13 cmain unsignedinta 65535 intb b a printf a u b d n a b 运算结果 a 65535 b 1 8 带符号的数据赋给长度相同的无符号变量原样赋给 连符号一起作为数值传送例T3 9 cmain unsignedinta intb 1 a b printf a u b d n a b 若b是正值且0 32767 则赋值后数值不变 运算结果 a 65535 b 1 3 复合的赋值运算符在赋值号前加其它运算符 可以构成复合运算符 如 a a b a bx x y 8 x y 8x x 3 x 3为了便于记忆 将赋值号左边移到赋值号右边 赋值号左边再补上变量名 如 a b a b a a b其中a是变量 b是表达式x y 8 x y 8 x x y 8 注意括号在C语言中 有十个二

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论