C语言数据类型和玉那算规则.ppt_第1页
C语言数据类型和玉那算规则.ppt_第2页
C语言数据类型和玉那算规则.ppt_第3页
C语言数据类型和玉那算规则.ppt_第4页
C语言数据类型和玉那算规则.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程 主讲 邓宏彬北京理工大学计算机学院 复习 基本概念什么是算法 如何设计算法 算法的两要素 基本功能操作控制结构常用算法枚举法 迭代法 递推法 递归法算法的特点有穷性 确定性 有效性 I O算法的表示流程图 C语言的发展历程C语言的特点C程序的结构规则函数的基本单元 main函数等标准库函数C语言的关键字 32个 C语言的上机执行过程 第三章数据类型与运算规则 本章要点 数据与数据类型基本数据类型及其表示算术运算与赋值运算关系运算与逻辑运算位运算其它运算混合运算及数据类型转换 3 1数据与数据类型 数据是程序加工 处理的对象 也是加工的结果 具有同样性质的数据可被分成一些集合 程序能对它们进行同样的操作 或采用同样的编码等 这样的集合称为数据类型 所有的程序语言都是用数据类型来描述程序中的数据结构 数据表示范围 数据在内存中的存储分配等 数据类型是计算机科学的核心概念之一 常数变量运算符表达式函数 把自然语言描述问题的方式转换为C语言的形式表达给计算机 规则 常数 变量 函数 算例 问题 常数3 5和3 6的存放空间是否相同 变量a如何表示 如何存放 计算机如何知道3 6和a之间的关系 和如何输入 如何存放 计算机如何识别 运算结果放在哪里 数据的描述数据的操作 程序 类型 运算符 计算机完成上述计算 首先要解决数据的输入和存放问题 程序的任务是对数据进行处理 数据是程序处理的对象 而运算符是施加给这些数据的操作 数据和运算符是表达式的基本元素 C语言的数据类型 3 2C语言基本数据类型及其表示 3 2 1常量与变量常量 在程序运行过程中 其值不能改变的数据称为常量 常量可以分为直接常量和符号常量 直接常量包括整型常量 实型常量 字符常量和字符串常量 如12 4 6 a CHINA 等 符号常量是指用一个指定的标识符代表某个常量 在程序中需要使用该常量时就可以直接引用标识符 C语言中用宏定义命令对符号常量进行定义 其定义形式为 define标识符常量 definePAI3 1415926常量并不占内存 在程序运行时直接调入寄存器中 变量在程序运行过程中 其值可以改变的数据称为变量 变量通过变量名标识 变量名和内存中的存储单元相对应 编写程序时通过变量名来存 取存储单元 C语言是一种强制定义型语言 变量必须先定义 后使用 定义时必须提供变量的名字和类型 变量可以分为数值变量 字符变量和指针变量 其中数值变量包括整型变量和实型变量 变量名由字母A B Z a b z 数字0 1 9和下划线 组成 变量名的第一个字符必须是英文字母或下横线 不能用系统中的关键字作为变量名变量名中的字母是区分大小写的 sum stu name age Lts 1 2 a232c x y start 9 c2 0NAMEname表示两个不同的标识符 养成良好的命名习惯 变量名的规定 变量必须先定义后使用如 inta b a 10 b a 12 c a b 15 1000 K 变量的3个属性 变量地址变量内容变量名 3 2 2整型数据 整型常量整型常量的类型根据值大小默认类型在常量后面加l或L 表示longint型例如 123L 0L 432l都是longint型常量 整型数据包括整型常量和整型变量 整型数据以二进制补码形式存储 整型常量的不同数值表示方法10进制 0 98进制 0 7 以0开头16进制 0 9 A F a f 以0 x或0X开头 例 100 8 0 010 024 0 x38 0X1F 数据在计算机内存中是以二进制数形式存放的 实际上 在计算机当中数据是以补码的形式存储的 正数的补码是它本身 负数的补码是其绝对值取反加1 例如 10原码1000000000001010绝对值0000000000001010取反1111111111110101加11111111111110110 10 整型变量 例如 inti j longk m unsignedintx y 变量有值吗 C中的所有变量必须先定义后使用 格式 类型说明符变量列表 整型变量的定义 整型变量的分类 0000000000000001 0000000000000011 0111111111111111 1000000000000000 1 3 最大的负数 215 32768 定点二进制补码表示占2个字节存储数的表示范围 32768 32767最高位 1 表负数 0 表正数 215的补码 a 215 1 32767 最大的正数 int型数的表示范围 3 2 3实型数据 C语言中实数和实型变量可分为三种类型 单精度型 float 4字节 双精度型 double型 8字节 长双精度型 longdouble 16字节 单精度实型数据的有效数字是7位 双精度实型数据的有效数字是16位 长双精度实型数据的有效数字是19位 名称存储字节表示范围说明方法有效位单精度 尾加F 4 1038 1038floata 7双精度 尾不加 8 10308 10308doublea 16长双精度 尾加L 16 104932 104932longdoublea 19 2 实型变量 1 2 23 1 27 1 127 2127 1038 与课本46页对比 数的范围数的取值范围是指数的绝对值有效位数据在计算机中存储和输出时能够精确表示的数字位数 实型常量的表示方法 1 小数形式 至少有一个小数点和一个数字 0 12 12 12 0 12 2 指数形式 e前有数字 e后有整数 1 345 10 21 345e 2 尾数 指数 1 2e3 12e 2 e21 2e3e1 2 实型数的分辨率 最小正数 10 38小于该数时处理为0下溢最大正数 1038大于该数时提示出错上溢 实型数在计算机内部都按指数形式存放实型数常数一般都作为双精度数处理数的存储结构和精度与计算机硬件特性有关 超出表示范围的数机器如何处理 main floata b a 0 123e40 b 0 123e 40 c 12345 6789 printf a e b e n a b printf f n 1 234 printf f n c printf f n 1111111111 2222222222f 1111111111 2222222222f printf f n 1 123456789 getch 20位 上溢 下溢为0 3 2 4字符型数据 将一个字符常量放到一个字符变量中 实际上并不是将该字符本身放到相应变量的内存单元中 而是将该字符的相应的ASCII码放到相应的存储单元中 字符型数据包括字符型常量和字符型变量 字符型常量又被称为字符常数 C语言中字符型常量是用单引号括起来的一个字符 如 a A 由于C语言对字母的大小写是敏感的 因此 a 和 A 是不同的字符型常量 字符型常量 在此有两点需要注意 字符型常量使用单引号作为标识 字符型常量只能包含一个字符 例 a A 1 abc a 定义形式char占存储空间 一个变量 1字节 一个字符变量只能包含一个字符 例 Main charc c c printf c c 运行结果 c 题目中有几个c 哪些是等价的 字符型变量 a 的ASCII值为97内存中存储形式 01100001 在ASCII范围以内 整型数据与字符型数据可以通用 字符型数据的存储格式 ASCII码字符 a A 1 存储为 97 65 49 例 字符串常量 字符串常量是用双引号括起来的一个或多个字符 n个字符组成的字符串常量 在内存中占空间为n 1个字节 字符串结束标记 空 字符 a 串长1 ThisisCstring 串长16 空格 串长1 不含空格 串长0 例 C中没有专用的字符串变量 对于不可显示字符 C语言提供的另一种字符型常量是转义字符常量 转义字符常量是以 开头的字符常量 它通知编译器需要用特殊的方式处理 后的字符 将 后的字符转换成另外的意义 n换行 t水平跳格 b退格 r回车 f走纸换页 反斜杠 单引号字符 双引号字符 dddddd表示1到3位八进制数字 xhhhh表示1到2位十六进制数字 例 60 是十进制数48 代表ASCII码字符0 105 是十进制数69 代表ASCII码字符E 015 是十进制数13 代表ASCII码字符回车 x1f 是十进制数31 代表ASCII码字符 x61 是十进制数97 代表ASCII码字符a main chara b c intd a 5 b 60 c A d 1089 printf a cb cc dd c n a b c d printf a db d n a b getch 按整数输出C 按字符输出D 按字符和整数输出a 思考 字符串 w 11 占几个字节 转义字符 字符串结束标记 w 11 字符串 w 11 0good 占几个字节 3字节 指针型数据及其表示 C语言定义了一种新的数据类型 指针类型 它是一个变量在内存中所对应的存储单元的地址 用来存放指针的变量称为指针变量 高级语言中的变量具有三个属性变量名变量的值变量的地址 访问内存的两种方式 直接访问 按地址直接存取 a间接访问 通过指针p间接存取 对于inta 10 c 5 floatb 3 5 内存分配 例 a的地址 存储变量2字节 a的内容 指针 a的地址 a是整型变量 存放内容p是指针变量 存放地址 a的地址 a的指针 指向a 指针运算符则 a为变量a的地址 p为指针变量p所指向的存储单元所存储的内容 例 inta 10 p x floatb 3 5 p1 charc p2 p a 定义 类型说明符 指针变量名 p是p指向的变量a 指针运算 p p 定义指针变量 指针初始化 指针赋值 指针变量的定义与赋值 类型说明符用来指定该指针变量指向的变量的类型 而并非指针的类型 C语言允许指针指向任何类型的对象 包括别的指针 指针运算符 取地址运算符同级 右结合 指针变量的赋值 inta 3 p p1 p2 p3 p4 p 指针变量的操作 inta 3 p p1 k p 因为 p a 操作结果使p1指向a 问题1 int i float p1 指针变量i中只能指向整型变量 指针变量p1中只能指向实型变量 问题2 指针变量能指向常数吗 讨论 指针的应用在第十章介绍 变量初始化 C语言允许变量初始化具有两种形式 一种是先声明后赋值 另一种是在定义变量的同时对该变量进行初始化 inta 3 inta b c 5 初始化不是在编译时进行 外部变量和静态变量除外 而是在程序运行时完成的 3 3算术运算和赋值运算 运算符是用于描述对数据进行运算的特殊符号 C语言的运算符按其在表达式中与运算对象的关系可以分为 单目运算符双目运算符三目运算符 C语言中的运算符和表达式 表达式的运算结果称为表达式的值 学习运算符应掌握的要点 运算符的种类与功能运算符与运算分量的关系 个数 类型 A B a b a b 目 关系 不同类型的变量 所占存储空间 数的表示范围 有效位和允许的操作不同 单目运算双目运算三目运算 按照运算符在表达式中所起的作用 运算符可以分为 1算术运算符2自增自减运算符3赋值运算符与复合赋值运算符4关系运算符5逻辑运算符6位运算符7条件运算符8逗号运算符 优先级与结合性 C语言中的运算符具有一般数学运算符的特性 即具有优先级和结合性 优先级是指同一个表达式中不同优先级的运算符进行计算时的先后次序 结合性是针对同一优先级的多个运算符而言的 它是指同一个表达式中相同优先级的多个运算符应遵循的运算顺序 优先级 运算符的执行顺序 结合性 相同优先级的多个运算符的运算顺序 运算结果的类型 X 5 8 a 100 X a b c a b c5 7 2a b 5 结果 自左向右 自右向左 整型 逻辑型 130 参考课本 P366 算术运算符与算术表达式 C语言基本算术运算符包括加 减 乘 除 以及求模 求余 运算符 和 运算符既具有单目运算符的取正值运算和取负值运算的功能 又具有双目运算的功能 作为单目运算符使用时其优先级高于双目运算符 求模运算符 的作用是求整数除法的余数 要求两侧都应该是整型数据 不能作用于实型数据 两个整数相除的结果是整数 如5 3的结果为1 小数部分被舍去 3300 5000003 3333336010 11 1 商 3余 1 10 3值是11 3值是1 2值是1 2值是10 0 3值是10 5 3值是10 5 3 值是10 3值是9 3值是 10 3值是10 3值是 10 3值是 自增 自减运算符 自增 自减运算符既可以放在操作数之前 也可以放在操作数之后 这两种写法是有差别的 如果自增 自减运算符放在操作数前面 则在表达式引用该操作数之前 先对其作加1或减1运算 如果自增 自减运算符在操作数之后 则表达式先引用该操作数 然后再对其加1或减1运算 例如 intx 10 y x printf d d x y Output 11 11intx 10 y x printf d d x y Output 11 10 注意 自增 自减运算符只能用于变量 而不能作用于常量或表达式 例如5 和 a b 都是不合法的 自增 自减运算符作为单目运算符 它的优先级高于所有双目运算符 自增 自减运算符的结合方向是 自右向左 例如 用于 运算的变量只能是整型 字符型和指针型变量 main inta b s a 5 b 5 s a b printf d d d n a b s s a b printf d d d n a b s s a b printf d d d n a b s s a b printf d d d n a b s s a b printf d d d n a b s s a b printf d d d n a b s 例 s a b s a b s a b s a b s a b s a b a 5 b 5 5 5 105 5 107 5 126 5 116 5 115 5 10 abs551065107512651155115510 题目分析 s i 2 k i i i i k i 2 k i i i 56 i k 515 自增之后再相加 讨论 i 2printf d i i i printf d i i i 已知 inti 1 j 2 k k i j C语言处理运算符 标识符 时 遵循自左向右组合的原则 两个 号是一个运算符 故处理成 i j 语句 k i j 编译不能通过 原因是它将前两个 处理成自增 接下来又将两个 号处理为自增 故不合语法 编程者可用空格或括号来表示正确的含义 k i j 一般不要用这样的语句 再如 printf 1011 n 本意想输出A1 编译器认为 后有4个数字 允许3个 故编译出错 已知 i 3 1 执行printf d i Output 3i的值为42 执行printf d i Output 4i的值为4 四 赋值运算符 将一个常量或一个表达式的值赋给一个变量 格式 变量名 表达式 x 5y x 10 赋值运算符和赋值表达式 赋值运算符构成了C语言最基本 最常用的赋值语句 C语言中赋值运算符用 表示 其功能是计算赋值运算符右边的表达式的值 并将计算结果赋给 左边的变量 在对赋值表达式求解过程中 如果赋值运算符两侧的数据的类型不一致 但都是数值型或字符型时 在赋值时要进行类型转换 可以将一个实型赋给一个整型也可将一个整型赋给一个实型 intx x 5 3 x的值为5floaty y 5 y的值为5 000000 赋值类型转换 例 接受赋值的变量类型决定了运算结果的类型 将实型数据赋给整型变量时 舍弃实数的小数部分 将整型数据赋给实型变量时 数值保持不变 但以浮点数形式存储到变量中 将一个double型数据赋给float型变量时 截取其前面7位有效数字 存放到float型变量的存储单元中 但应注意数值范围不能溢出 将一个float型数据赋给double型变量时 数值不变 有效位数扩展到16位 在内存中以64位存储 字符型数据赋给整型变量时 将字符数据放入整型变量的低8位中 此时有两种情况 对无符号型变量赋值 则将字符的8位放入整型变量的低8位 高8位补0 对有符号型变量赋值 若字符最高位为0 则整型变量的高8位补0 若字符最高位为1 则高8位全补1 这种方法称为 符号扩展 这样做的目的是使数值保持不变 将一个int型变量赋给一个char型变量时 只将其低8位原封不动地送到char型变量中 将带符号的整型数据 int型 赋给long型变量时 要进行符号扩展 将int型数据的16位送入long型变量的低16位中 如果int型数据为正数 则long型变量的高16位补0 如果int型数据为负数 则long变量的高16位补1 以保持数值不改变 若将一个long型数据赋给一个int型变量 只需将long型数据中的低16位原封不动地送到整型变量中 将unsignedint型数据赋给longint型变量时 不存在符号扩展问题 只需将高16位补0即可 将一个unsigned型数据赋给一个占字节数相同的int型变量 可将unsigned型数据原样送到int型变量中 但如果数据范围超过相应整数的表示范围 则会出现数据溢出 将无符号型数据赋给长度相同的有符号型变量时 数据原样照赋 强制类型转换运算符 C语言在处理两种不同数据类型的数据进行运算时 系统会自动地将两个操作数作适当的类型转换后再进行运算 这种数据类型的转换时按照系统默认的规则由低级类型向高级类型转换的 C语言规定也可以利用强制类型转换运算符将一个表达式的值转换成所需类型 强制类型转换运算符的一般形式为 类型名 表达式 注意 在强制类型转换运算符中 表达式应该用括号括起来 以表示将整个表达式的值进行强制类型转换 例如 int x y 则只表示将x转换成整型 然后与y相加 需要说明的一点是在强制类型转换时 得到一个所需类型的中间变量 原来变量的类型并未发生变化 例如inti floatx 3 6 i int x printf x f i d x i 输出 x 3 6 i 3 思考题 main inta 32767 b 3 longc c a b printf c ld c getchar Output 32770 32766 c long a b 或c long a b 算术运算与赋值运算相结合 例 复合赋值运算符和复合赋值表达式 main inta b c d e a 2 b 5 c 6 d 10 a b b c c d d a a c printf d d d d d n a b c d a Output 7 1 60 1 7 例 注意 如果复合赋值运算符的右侧是包含若干项的表达式 则右侧的表达式相当于一个整体 如 x y 8 x x y 8 3 4关系运算与逻辑运算 所谓 关系运算 实际上是 逻辑比较运算 将两个数据进行比较 判断其比较结果是否符合给定的条件 大于 大于等于 小于 不等 小于等于 恒等 六个 的优先级低于其余四个 优先级 关系运算的优先级高于赋值 低于算术 区别赋值 在关系表达式中关系运算符的操作对象可以是算术表达式 关系表达式 逻辑表达式和字符表达式 且关系运算符要求其两个运算对象为同类型数据 关系表达式的值是一个逻辑值 即 真 或 假 C语言没有逻辑型数据 因此C语言以1代表 真 值 以 0 代表 假 值 如a 3 b 2 c 1 则关系表达式a b c的值为真 表达式的值为1 关系符与运算分量构成关系表达式关系表达式的结果是一个逻辑值 根据关系是否满足 分别取真或假 例 inti 1 j 7 a a i j 4 0 a的值 结果 a 2 结合性 从左向右 a b c e1关系运算符e2 算术式 100 13 5c5 18 90 int 2 5 2 5 逻辑运算符和逻辑表达式 逻辑运算符是表述表达式之间的逻辑关系的一种运算符 是单目运算符 是双目运算符 的优先级高于 的优先级高于 并且 优先级高于算术运算符 和 优先级低于关系运算符 结合性为从右向左 和 的结合性为从左向右 五 逻辑表达式 用逻辑运算符将关系运算表达式或逻辑量连接起来构成逻辑表达式 a b e1逻辑运算符e2 任何非零实数均作为逻辑上的1 例 a 5 b 7 c 4 d 3x a b c d d a 先做算术运算 再做关系判断 将最后结果赋给x 逻辑表达式的值是1或0 表示真或假 在逻辑表达式中 并不是所有的逻辑运算都必须执行 如果 的一边已经为0 结果一定为0如果 的一边已经为1 结果一定为1 a b ca非0时再判断b a b均非0再判断ca b ca为非0 不必判断b和c 结果一定为1 已知 a 1 b 2 c 3 d 4 m 1 n 1执行 m a b n c d 之后m n 由于a b的值为0 的结果一定为0 即m 0 n c d 不再运算 n维持原有的值 即n 1 17 23 2 7 例 10001 求表达式的值 用C语言描述 1 a小于b或小于c2但a和b都大于c3 a和b中有一个大于c4 a是非正整数5 a是奇数6 a不能被b整除7 a是带小数的正数 b是带小数的负数 如何表示闰年 能够被4整除同时不能被100整除 能够被400整除 或 条件运算符与条件表达式 条件运算符是C语言中唯一的三目运算符 其形式为 表达式1 表达式2 表达式3条件运算符的功能是 先计算表达式1的值 若其值为非0值 即逻辑真值 则计算表达式2的值 并将表达式2的值作为整个条件表达式的结果 若表达式1的值为0 即逻辑假值 则计算表达式3的值 并将表达式3的值作为整个条件表达式的结果 3 5位运算 数据在计算机中是以二进制代码的形式表示的 每一个二进制数称为一位 C语言的主要设计目的是为描述系统而设计的 因此C语言特别提供了对二进制位的操作功能 称为位运算 在此需要说明的一点是 位运算符的运算对象只能是整型或字符型的数据 C语言提供了6种基本位运算 见P66表3 9 按位与运算 按位与运算具有一些特殊的用途 清零 如果想将一个整数的个别位清零 则只要找到一个二进制数 其相应位的值位0 然后使两个数进行按位与运算 即可达到清零的目的 取一个数中的某些指定位 只需要将其与一个相应位的值为1的整数进行按位与运算即可 按位或运算具有的一些特殊的用途 按位或运算常用来对一个数据的某些位置1 只需要将这个数与一个相应位为1的整数进行按位或运算即可 按位异或运算具有的一些特殊的用途 使特定位翻转 如果想使变量a的低四位翻转 即0变为1 1变为0 可以将它与00001111进行按位异或运算 要使哪几位翻转就将与其进行位异或运算的整数的该几位置1即可 与0相异或 保留原值 按位取反运算 按位取反运算规则是将二进制数按位取反 即将0变成1 将1变成0 左移运算符左移运算符用来将一个数的各二进制位全部左移若干位 例如a 2 高位左移后溢出 舍去不起作用 右边补0 左移n位相当于该整数乘以2n 例如15 2 60 但此结论只适用于该数左移时被移出舍弃的高位种不包含1的情况 右移运算符右移运算符用来将一个整数的各二进位全部右移若干位 例如a 2 移到右端

温馨提示

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

评论

0/150

提交评论