C语言 数据类型、运算符和表达式ppt课件_第1页
C语言 数据类型、运算符和表达式ppt课件_第2页
C语言 数据类型、运算符和表达式ppt课件_第3页
C语言 数据类型、运算符和表达式ppt课件_第4页
C语言 数据类型、运算符和表达式ppt课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第3章数据类型 运算符与表达式3 1C的数据类型算法处理的对象是数据 考虑算法时要注意数据结构 数据是以种特定的形式存在的 整 实 字符等 算法与编程是相辅相成的 考虑的问题有 1 数据的描述 称数据结构 加工处理的数据类型 2 动作的描述 告诉计算机要的操作步骤 数据结构 反映不同数据的构造形式 不同语言所提供的数据结构是不同的 因而算法也有差异 例如 对十个整数进行排序和对十个整数构成的数组排序算法是不同的 在考虑算法时 必须考虑数据结构 以便选择最佳设计方案 C语言提供的数据结构是以数据类型的形式出现的用指针 结构体还可构成链表 树 栈等复杂的数据结构 整型字符型实型 浮点型 枚举类型 单精度型双精度型 数组类型结构体类型共用体类型 基本类型 构造类型 指针类型 空类型 void 数据类型 3 2常量与变量3 2 1常量和符号常量常量 在程序执行过程中 数值始终保持不变的量 整型 5 26 0实型 3 14 2 45 2 17178字符 a 1 A 标识符 符号 definepi3 14常量一般从其字面形式即可判别 例T3 1 c definePRICE30main intnum total num 10 total num PRICE printf total d total 输出 total 300符号常量 见名知意 程序中一改全改 3 2 2变量变量 在程序执行过程中 其值可以变化的量 说明 1 变量名 由合法标识符 函数 数组 文件 结构体等名称都称标识符 组成 2 标识符构成 字母 数字 下划线 第一个字符必须是字母或下划线 如 ab 12 a3c5均为合法标识符 而5ba e wang 1为非法 3 标识符长度 一般1 8个合法字符 Tc中 长度达248个字符 有效字符前32个 4 标识符中 大小写字母是有区别 如 A a是两个不同的标识符 5 变量的使用 按先定义后使用的原则进行 6 变量类型能进行有关运算的合法性检查 如a b 两边必须是整型数据 7 不同类型的变量 在内存中占据不同的存储单元 变量所对应的单元中存放变量的值 要区分变量名和变量值两个不同的概念 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 整型变量在内存中的存放形式数据在内存中是以二进制补码形式存放的 例 inti j i 10 j 10 正数的补码 与原码相同 2 整型变量的分类根据数值的范围可定义以下类型的变量 1 基本型 用int定义2 短整型 用shortint或short定义3 长整型 用longint或long定义整型 unsignedint4 无符号型 短整 unsignedshort长整 unsignedlong 无符号数据的特点 最高位不是作为符号位 而是作为存放有效数值本身 它不能存放负数 例 inta a的数值范围为 32768 32767 unsignedintb b的数值范围为0 65535 类型比特数取值范围int16 32768 32767short16 32768 32767long32 2147483648 2147483647unsignedint160 65535unsignedshort160 65535unsignedlong320 4294967297 ANSI标准定义的整数类型 3 整型变量的定义 对变量强制类型定义的目的 让编译为其分配内存单元 各种变量的定义一般在函数的开始部分 也可以在分程序 中定义 若在分程序中定义 其作用域仅在分程序中有效 例T3 2 cmain inta b c d unsignedintu a 12 b 24 u 10 c a u d b u inta a 8 9 printf a d n a 加上此复合语句结果 printf a u d b u d n c d 运算结果 a u 22 b u 14 由此可见 不同类型的整型数据可以进行混合运算 4 整型数据的溢出int型变量最大允许值为32767 如果大于此数 将产生溢出例3 3整型数据的溢出情况main inta b a 32767 b a 1 printf d d a b 运行结果 32767 32768 从上图可知 变量a的最高位为0 低15位为1 表示32767而变量b最高位为1 低15位为0 表示 32768 此种情况 编译系统不会报错 这要靠编程者的细心和经验 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 3 在函数调用时 若被调用函数的形参是长整型变量 则要求主调函数的实参也是长整型数据 3 4实型数据3 4 1实型常量的表示方法实数又称浮点数1 十进制形式 由数字和小数点组成 如 3 14 0 26 0 0 326 452 指数形式 由尾数部分 字母e或E 指数部分组成 如 48 62e 12 其中 48 62为尾数 12为指数 e为基数10 它表示48 62 1012C规定 e的前面要有数字 e的后面要有整数 3 4 2实型变量1 实型数据在内存中的存放形式float型变量 32位double型变量 64位 2 实型变量的分类float型表示数的范围 最大正数 1 2 23 2127 1038最小负数 1 2127 1038接近0的正数 2 1 2 128 3 9 10 38接近0的负数 2 1 2 23 2 128 3 9 10 38double型表示数的范围 最大正数 1 2 52 21023 10308最小负数 1 21023 10308接近0的正数 2 1 2 1024 10 308接近0的负数 2 1 2 52 2 1024 10 308longdouble型表示数的范围 最大正数 10 4931 104931 实型常量可赋给float或double型变量 根据变量类型截取实型常量的有效位 单精度实型数据 float 表数范围 十进制形式 7位有效位指数形式 e 双精度实型数据 double 表数范围 十进制形式 16位有效位指数形式 e 双精度实型数据 longdouble 表示数据范围 十进制形式 16位有效位指数形式 e x 3 实型数据的舍入误差实型数据是由有限的存储单元来存储的 因此提供的有效数字总是有限的 在有效位以外的数字将被舍去 由此可能会有一些误差 例T3 4 cmain floata b longdoublec a 123456 678e5 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 系统将其按单精度数运算 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 111110 3 5字符型数据3 5 1字符常量字符常量 用一对单引号括起的一个字符 如 a A 9 说明 1 字符常量的值是该字符在ASCII码中的码值 2 a 和 A 是两个不同的字符常量 a 97 A 653 开头的字符序列称为特殊形式的字符常量 转义字符 例T3 5 cmain printf n printf ab c t de rf tg n printf h ti b bj k n 运行后屏幕显示结果 fgdehj k 注意 打印机和屏幕显示结果不同 不会象屏幕那样会 抹掉 原字符 能够真正反映输出的过程和结果 运行后打印机显示结果 fabgdehjik 3 5 2字符变量字符变量 用于存放一个字符常量 字符变量的定义形式 如 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 例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 例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在TurboC中 字符数据占一个字节 当ASCII码值在128 255之间时 其最高位为1 占据了符号位 以数据输出时为负数 以字符输出时是对应的字符 以无符号数据输出时 也是其对应的数据 例 T3 7 2 cmain charc1 376 unsignedcharc2 376 printf d c n c1 c1 printf d c n c2 c2 运行结果 2 2的补码 254 Charc1Unsignedc2 3 5 4字符串常量字符串常量 用一对双引号括起的字符序列 如 BEIJING CHINA 123 a 字符串使用的有关说明 字符串可出现在输出函数中 如 printf ThisisaCprogram n 2 字符常量与字符串常量是不同的 如 charc1 c2 c1 a 可以c2 a 错误不能把字符串赋给字符型变量 字符串在内存中存放时 系统自动加字符串结束符 0 该字符在ASCII码中的码值为0 是空操作符 即无动作 不显示 3 C中无字符串变量 字符串可以赋给字符数组 4 若字符串为 CHINA 它在内存中的实际存储形式是 其长度是6而不是5 最后一个字符是 0 是系统自动加上的 不能人为加上此字符 它既无显示或打印输出也无任何动作 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语言中 整 实 字符型数据间可以混合运算一 不同类型数据间进行运算时 要转换成同一类型转换过程中 低类型向高类型靠拢 然后进行运算 不同类型之间转换如下图所示 横向左箭头为必转 纵向箭头表示有条件类型转换 高double float long unsigned 低int char chort 二 类型转换进一步说明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运算符简介除控制语句 if while for 和输入 输出函数 大部分操作都作为运算符处理 1 算术运算符 2 关系运算符 5 赋值运算符 6 条件运算符 7 逗号运算符 8 指针运算符 9 求字节数运算符 sizeof10 强制类型转换运算符 类型 11 分量运算符 12 下标运算符 13 其它运算符 如函数调用 2 8 2算术运算符和算术表达式1 基本的算术运算符 加法或正值运算符 如 2 3 5 减法或负值运算符 如 8 3 6 乘法运算符 如 3 5 除法运算符 两个可以是整或实型数据 求余运算符两个必是整型数据 例T3 7 4 c整型数据除法运算main inta b c a 5 b 3 c a b printf c d n c 运算结果 c 1 例T3 7 5 c实型数据除法运算main floata b c a 5 b 3 c a b printf f n c 运算结果 1 666667说明 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 2 算术表达式和运算符的优先级与结合性算术表达式 用算术运算符和括号将运算对象 常量 变量 函数 连接起来的 符合C语言语法规则的式子 如 a b c 1 5 a 在C语言中 运算符共有15个优先级 其中算术运算符的优先级是 3级 4级 算术运算符的结合方向 从左向右如 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 i x 3 6 i int x printf x f i f n x i 运算结果 x 3 600000 i 3 000000 例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的值发生变化没有 答案 a b之值没有发生变化 4 自增 自减运算符 增1运算符 使变量值增1 减1运算符 使变量值减1 如 i i 在使用变量i之前 先使变量i加 减 1 i i 在使用变量i之后 使变量i值加 减 1 例T cmain inti j i 3 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 3i2 4例T3 8 5 cmain inti i 3 printf i1 d n i printf i2 d n i 运算结果 i1 4i2 4 5 有关表达式使用中的问题说明 1 C中的运算符和表达式 表达式中的子表达式的求值顺序各编译系统是有差别的 如对表达式 a f1 f2 一般情况下是先调用f1 再调用f2 先后次序无关紧要 但有些情况 结果却不同 编程时要注意所用的编译系统 我们主要是以TurboC加以讨论 若inti i 3 又如表达式 i i i 有的系统的求值顺序是先求第一个 再求第二个 最后求第三个子表达式 其结果是 3 4 5 12 最后i的值为6而在TurboC中却有所不同 其结果是 9 i自加三次以后为6 例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 上述情况有时往往造成混淆 解决的方法 把各中间结果先计算送各中间变量 然后相加 例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 原因 X 3 3 7 7 20Y 30 30 26 26 112 2 在C语言中运算符的确定在由多个字符组成的表达式中 应尽可能多地从左向右将若干个字符组成一个运算符 如 i j其结合性是 i j而不是 i j 3 printf函数输出实参的顺序如 inti 3 printf d d n i i 有的系统按从左到右的顺序求值 输出结果是 3 3而TurboC是按从右到左顺序求值 输出结果是 4 3结论 不写别人甚至自己都看不懂的程序 也不写那些不知道系统会怎样运行的程序 3 9赋值运算符和赋值表达式1 赋值运算符 是赋值号 也是赋值运算符功能 将赋值号右边表达式的值赋给赋值号左边的变量 赋值号同时含有计算的功能 如 a 3 b x y 注意 a b变量中原来不管存放什么值 执行赋值语句后 新值将取代旧值 2 类型转换变量类型的不同 所接收的数据也是不同的 当赋值运算符两侧的数据类型不一致时 在赋值时要进行类型转换 1 实型数据赋给整型变量时 舍去实型数据的小数部分 如 inti i 3 56 结果i的值为3 2 整型数据赋给实型变量时 数值不值 但以浮点形式存放于内存 如 floata 23 先将23转换成23 000000 然后送a中 doubleb 23 先将23转换为23 00000000000000 然后送b中 3 double型数据赋给float变量截取其前面的7位有效数字 存放到float单元 应注意数值范围不能溢出 如 floatf doubled 123 45678e65 f d 由于数据溢出 f将得到错误的值float数据赋给double变量时 数值不变 有效位扩展到16位 4 字符型数据赋给整型变量字符数据占一个字节 整型数据占两个字节 字符数据存入整型变量的低8位 有两种情况 无符号字符型数据赋给整型变量时 将其存放在整型变量的低8位中 而高位以0补齐 T3 8 8 cmain inti unsignedcharc c 376 i c printf i d c d n i c 结果 i 254c 254 带符号的字符型数据赋给整型变量时若最高位为1 负数 则整型变量的高8位补1 若最高位为0 正数 则整型变量高8位补0 例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 a c i printf i d c d d i c 运算结果 i 289 c 33 6 long型数据赋给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型数据送到longint型变量的低16位 longint的变量高16位补0例T3 8 12main unsigneda 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 1111111111111111 1111111111111111 a b 符号位 数值位 运算结果 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语言中 有十个二元运算符 可与赋值号一起构成复合运算符 其优点是 简化程序 提高编译效率 4 赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子 1 一般形式 2 赋值表达式求解过程 计算赋值号右边表达式的值 然后赋给左边的变量 如 a 3

温馨提示

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

评论

0/150

提交评论