第3章数据类型运算符和表达式1_第1页
第3章数据类型运算符和表达式1_第2页
第3章数据类型运算符和表达式1_第3页
第3章数据类型运算符和表达式1_第4页
第3章数据类型运算符和表达式1_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

第3章数据类型 运算符与表达式 3 1C的数据类型3 2常量与变量3 3整型数据3 4实型数据3 5字符赋值型数据3 6变量赋初值3 7各类数值型数据间的混合运算3 8算术运算符和算术表达式3 9赋值运算符与赋值表达式3 10逗号运算符与逗号表达式 程序设计概述 一个程序应包括对数据的描述和对数据处理的描述 1 对数据的描述 即数据结构 数据结构是计算机学科的核心课程之一 有许多专门著作论述 本课程就不再赘述 在C语言中 系统提供的数据结构 是以数据类型的形式出现的 2 对数据处理的描述 即计算机算法 算法是为解决一个问题而采取的方法和步骤 是程序的灵魂 为此 著名计算机科学家沃思 NikiklausWirth 提出一个公式 数据结构 算法 程序实际上 一个程序除了数据结构和算法外 还必须使用一种计算机语言 并采用结构化方法来表示 3 1C的数据类型 C语言提供的数据结构 是以数据类型形式出现的 具体分类如下 1 基本类型分为整型 实型 又称浮点型 字符型和枚举型四种 2 构造类型分为数组类型 结构类型和共用类型三种 3 指针类型 在第9章中介绍 4 空类型C语言中的数据 有常量和变量之分 它们分别属于上述这些类型 本章将介绍基本类型中的整型 实型和字符型三种数据 3 2常量与变量 2 3 1常量和符号常量1 常量的概念在程序运行过程中 其值不能被改变的量称为常量 2 常量的分类 1 整型常量 2 实型常量 3 字符常量 4 符号常量 常量的类型 可通过书写形式来判别 符号常量 代表常量的标识符 符号 例2 1 definePRICE30main intnum total num 10 total num PRICE printf total d total 3 2 2变量1 变量的概念在程序运行过程中 其值可以被改变的量称为变量 2 变量的两个要素 1 变量名 每个变量都必须有一个名字 变量名 变量命名遵循标识符命名规则 2 变量值 在程序运行过程中 变量值存储在内存中 在程序中 通过变量名来引用变量的值 在源程序中 变量用标识符 以字母 数字 下划线组成 且第一个字符必须为字母或下划线 表示 变量在内存中占据一定的存储单元 变量名的类型表明存储单元的数量 例如 整型变量int 占2字节存储单元 单精度实数float占4字节 变量名表示存储单元的值 该值在程序运行过程中可能随时变化 可以用运算符 取得存储单元的地址 标识符命名规则 1 有效字符 只能由字母 数字和下划线组成 且以字母或下划线开头 2 有效长度 随系统而异 但至少前 个字符有效 如果超长 则超长部分被舍弃 例如 由于student name和student number的前 个字符相同 有的系统认为这两个变量 是一回事而不加区别 在TCV2 0中 变量名 标识符 的有效长度为 个字符 缺省值为 3 C语言的关键字不能用作变量名 注意 C语言对英文字母的大小敏感 即同一字母的大小写 被认为是两个不同的字符 习惯上 变量名和函数名中的英文字母用小写 以增加可读性 思考题 在C语言中 变量名total与变量名TOTAL ToTaL tOtAl等是同一个变量吗 标识符命名的良好习惯 见名知意 所谓 见名知意 是指 通过变量名就知道变量值的含义 通常应选择能表示数据含义的英文单词 或缩写 作变量名 或汉语拼音字头作变量名 例如 name xm 姓名 sex xb 性别 age nl 年龄 salary gz 工资 合法变量名 sum average class day month student name above lotus 1 2 3 basic不合法的变量名 M D Jhon 123 33 3D64 a b变量名的长度 C语言中未统一规定 随不同开发系统而变 变量名允许长度8允许长度32student namestudent number相同变量名不同变量名 C语言对变量的要求 先定义 后使用 因为 1 编译程序不能翻译未定义变量 2 编译程序在编译时根据变量类型确定存储单元的数量 3 编译程序在编译时根据变量类型进行语法检查 例 整型变量a b可以进行 求余 运算a b若把a b定义为实数 则上述运算非法 3 3整型数据3 3 1整型常量的表示方法 三种表示形式整型常量即整常数 在 语言中可用三种形式表示 1 十进制整数 例如10 36 2 八进制整数 以数字 开头 例如012表示 12 8 3 十六进制整数 以数字 小写字母x开头 例如0 x36 表示 36 16 3 3 2整型变量1 整型数据在内存中的存放形式数据在内存中是以二进制形式存放的 实际上数据是以补码表示的 如inta b a 10 b 10 ab 2 整型变量的分类根据占用内存字节数的不同 整型变量又分为 类 1 基本整型 类型关键字为int 2 短整型 类型关键字为short int 3 长整型 类型关键字为long int 4 无符号整型 无符号型又分为无符号基本整型 unsigned int 无符号短整型 unsignedshort 和无符号长整型 unsignedlong 三种 只能用来存储无符号整数 2 占用内存字节数与值域C语言标准没有规定整型变量在计算机内存中所占的字节数 它与具体的机器和操作系统有关 上述各类型整型变量占用的内存字节数 随系统而异 在16位操作系统中 一般用 字节表示一个int型变量 且long型 字节 int型 字节 short型 字节 显然 不同类型的整型变量 其值域不同 占用内存字节数为n的 有符号 整型变量 其值域为 2n 8 1 2n 8 1 1 无符号整型变量的值域为 0 2n 8 1 例如 PC机中的一个int型变量 其值域为 22 8 1 22 8 1 1 即 32768 32767 一个unsigned型变量的值域为 0 22 8 1 即0 65535 二 整型变量的定义inta b 指定变量a b为整型 unsignedshortc d 指定变量c d为无符号短整型 longe f 指定变量e f为长整型 程序中在函数的开头部分定义变量 例3 2 整型变量的定义与使用main inta b c d 指定变量a b c d为整型 unsignedu 指定变量u为无符号整型 a 12 b 24 u 10 c a u d b u printf a u d b u d n c d 程序运行显示 a u 22 b u 14 4 整型数据的溢出例3 3整型数据的溢出main inta b a 32767 b a 1 printf d d a b 运行结果为32767 32768 a b 三 整型常量的类型1 整型常量的值在 32768 32767范围内 编译器认为是int类型 2 整型常量的值超过上述范围 而在 2147483648 2147483647范围内 编译器认为是long类型 3 在整型常量的值后面加字母L 大写L或小写l 则告诉编译器 把该整型常量作为long类型处理 例 123L 0L 4 在整型常量的值后面加字母u 则认为是unsignedint型 5 常量无unsigned型 类型匹配规则类型匹配规则为 一个整型常量 可以赋给能容纳下其值的整型变量 例如 其值在 的int整型常量 可以赋给int型变量 shortint型变量和longint型变量 其值在 的整型常量 就只能赋给longint型变量 注意 常量无unsigned型 但一个非负整型常量 只要它的值不超过相应变量的值域 即取值范围 也可以赋给unsigned型变量 3 4实型数据 3 4 1实型常量的表示方法实型常量即实数 在 语言中又称浮点数 其值有两种表达形式 1 十进制形式 例如3 14 9 8 0 123 123 123 0 123 0 0 必须有小数点 2 指数形式 E e 例如3 0 5 123e3或123E3 123E 2等 但注意字母e或E之前必需有数字 且e的后面的指数必需为整数 如e3 2 1e3 5 e3 e等都不是合法的指数形式 规范化的指数形式 即在注意字母e或E之前的小数部分中 小数点左边应有一位 且只能有一位 非零的数字 如 2 378e23 0999E56 46832e1212 908e100 4578e3756e0 3 4 2实型变量1 实型数据在内存中的存放形式 数符小数部分指数 31459 101 3 14159在4个字节 32位 中 究竟用多少位来表示小数部分 多少位来表示指数部分 标准C并无规定 由各C编译系统自定 2 实型变量的分类 语言的实型变量 分为两种 1 单精度型 类型关键字为float 一般占 字节 位 提供 位有效数字 2 双精度型 类型关键字为double 一般占 个字节 提供15 16位有效数字 3 长精度型 类型关键字为longdouble 一般占10个字节 提供18 19位有效数字 floatx y 指定x y为单精度实型变量 doublez 指定z为双精度实型变量 longdoublet 指定t为长精度实型变量 用得较少 3 实型数据的舍入误差例3 4 main floata b a 123456 789e5 b a 20 printf f f a b 程序运行时输出b的值与a值相等 3 4 3实型常量的类型许多C编译系统将实型常量作为双精度来处理 如 floatf f 2 45678 4523 65 系统将2 45678和4523 65按双精度数据存储 占64位 和运算 得到一个双精度的乘积 然后取前7位赋给实型变量f 这样结果更精确 但运算速度降低了 可以在数的后面加字母f或F 1 57f 345 89f 这样编译系统就会按单精度 32位 处理 实型常量不分float型和double型 一个实型常量 可以赋给一个实型变量 float型 double型或longdouble型 根据变量的类型截取实型常量中相应的有效数字 floata a 111111 111 由于float型变量只能接收7位有效数字 因此 后两位小数不起作用 如果a改为double型 则能全部接收 3 5字符型数据 3 5 1字符常量1 字符常量的定义用一对单引号括起来的单个字符 称为字符常量 例如 A 等 2 转义字符 语言还允许使用一种特殊形式的字符常量 就是以反斜杠 开头的转义字符 注意 如果反斜杠或单引号本身作为字符常量 必须使用转义字符 转义序列主要用来控制打印机和屏幕输出 例 printf nsumis d n n sum 案例2 1 用转义字符输出可打印字符和不可打印字符 案例代码文件名 AL2 1 C 程序功能 用转义字符输出可打印字符和不可打印字符 main printf x4F x4B x21 n 等价于printf OK n printf x15 xAB n 程序运行结果如下 2 6 2字符变量字符变量的类型关键字为char 字符变量用来存储字符常量 只能存放一个字符 例如 charc1 c2 定义两个字符变量 c1 c2 c1 a c2 b 给字符变量赋值 字符变量在内存中占一字节 注意 一个字符变量不能用来存放一个字符串 包括若于字符 3 5 3字符数据在内存中的存储形式及其使用方法将一个字符常量存储到一个字符变量中 实际上是将该字符的ASCII码值 无符号整数 存储到内存单元中 即字符在内存中以ASCII码存放 例2 4 main charc1 c2 c1 97 c2 98 printf c c c1 c2 该例的输出是 ab 字符以ASCII码存储 其存储方式与整数类似 从而 C语言允许字符和整数之间进行运算 所以 语言允许字符型数据与整型数据之间通用 1 一个字符型数据 既可以字符形式输出 也可以整数形式输出 例2 2 字符变量的字符形式输出和整数形式输出 程序功能 用字符形式和整数形式输出字符变量 main charch1 ch2 ch1 a ch2 b printf ch1 c ch2 c n ch1 ch2 printf ch1 d ch2 d n ch1 ch2 程序运行结果 ch1 a ch2 bch1 97 ch2 98 2 允许对字符数据进行算术运算 此时就是对它们的ASCII码值进行算术运算 例2 3 字符数据的算术运算 程序功能 字符数据的算术运算 main charch1 ch2 ch1 a ch2 B 字母的大小写转换 printf ch1 c ch2 c n ch1 32 ch2 32 用字符形式输出一个大于256的数值 printf ch1 200 d n ch1 200 printf ch1 200 c n ch1 200 printf ch1 256 d n ch1 256 printf ch1 256 c n ch1 256 程序运行结果 ch1 A ch2 bch1 200 297ch1 200 ch1 256 353ch1 256 a思考题 用字符形式输出一个大于256的数值 会得到什么结果 3 5 4字符串常量1 字符串常量的概念和字符串长度字符串常量是用一对双引号括起来的若干字符序列 字符串中字符的个数称为字符串长度 长度为0的字符串 即一个字符都没有的字符串 称为空串 表示为 一对紧连的双引号 例如 Howdoyoudo Goodmorning 等 都是字符串常量 其长度分别为14和13 空格也是一个字符 如果反斜杠和双引号作为字符串中的有效字符 则必须使用转义字符 例如 1 C msdos v6 22 C msdos v6 22 2 Isay Goodbye Isay Goodbye 2 字符串的存储C语言规定 在存储字符串常量时 由系统在字符串的末尾自动加一个 0 作为字符串的结束标志 注意 在源程序中书写字符串常量时 不必加结束字符 0 否则画蛇添足 如果有一个字符串为 CHINA 则它在内存中的实际存储如下所示 最后一个字符 0 是系统自动加上的 它占用 字节而非 字节内存空间 综上所述 字符常量 a 与字符串常量 a 是两回事 1 定界符不同 字符常量使用单引号 而字符串常量使用双引号 2 长度不同 字符常量的长度固定为1 而字符串常量的长度 可以是0 也可以是某个整数 3 存储要求不同 字符常量存储的是字符的ASCII码值 而字符串常量 除了要存储有效的字符外 还要存储一个结束标志 0 另外 charc c a 字符 a c a 字符串 a 2 6变量赋初值在定义变量的同时指定其初值 例 inta 3 floatf 3 56 charc a inta b c 5 指定c的初值为5 未指定ab的初值 注意 多个变量指定相同的初值 inta b c 3 inta 3 b 3 c 3 初始化是不是在编译时完成的 而是在程序运行时执行本函数时赋予初值的 相当于一个赋值语句 3 7各类数值型数据间的混合运算整型 实型 包括单 双精度 字符型数据可以混合运算 因为字符数据与整型数据可以通用 例 10 a 1 5 8765 1234 b 混合运算时 先转换成同一种类型 然后进行运算 转换规则如下 1 横向向左的箭头 表示必须的转换 char和short型必须转换成int型 float型必须转换成double型 2 纵向向上的箭头 表示不同类型的转换方向 例如 int型与double型数据进行混合运算 则先将int型数据转换成double型 然后在两个同类型的数据间进行运算 结果为double型 注意 箭头方向只表示数据类型由低向高转换 不要理解为int型先转换成unsigned型 再转换成long型 最后转换成double型 例如 inti floatf doubled longe 则表达式10 a i f d e的运算次序是 表达式10 a i f d e的运算次序是 进行10 a 运算 先将 a 转换为整数97 运算结果为整数107 进行i f运算 先将i和f均转换为double类型 实运算过程总是使用double类型 仅在把结果存入存储器时 才可能使用float类型 运算结果是double类型 整数107与i f的积相加 先将整数107转换为double类型 107 0 运算结果是double类型 进行d e运算 先将longe转换为double类型 运算结果是double类型 进行 运算 结果为double类型 上述的类型转换是由系统自动完成的 2 8算术运算符和算术表达式2 8 1C运算符简介 算术运算符 关系运算符 赋值运算符 条件运算符 逗号运算符 指针运算符 求字节数运算符sizeof强制类型转换运算符 类型 分量运算符 点 下标运算符 其他函数调用运算符 2 8 2算术运算符和算术表达式一 基本的算术运算符 注 5 3 1 余 2 或 2 余 1 TurboC取 1结果 向零取整 1 关于除法运算 C语言规定 两个整数相除 其商为整数 小数部分被舍弃 例如 5 2 2 2 关于求余数运算 要求两侧的操作数均为整型数据 否则出错 二 算术表达式和运算符的优先级与结合性 1 表达式的概念用运算符和括号将运算对象 常量 变量和函数等 连接起来的 符合 语言语法规则的式子 称为表达式 单个常量 变量或函数 可以看作是表达式的一种特例 将单个常量 变量或函数构成的表达式称为简单表达式 其它表达式称之为复杂表达式 2 算术表达式的概念用算术运算符和括号将运算对象 也称操作数 如常量 变量 函数等 连接起来 符合C语法规则的式子 例如 3 6 9 x y 2 1 3 6 9 x y 2 1等 都是算术表达式 C语言规定了运算符的优先级与结合性 在表达式求值时 先按运算符的优先级别高低次序执行 如果一个运算对象两侧的运算符的优先级别相同 则按规定的 结合方向 处理 3 运算符的优先级与结合性 1 语言规定了运算符的优先级和结合性 所谓结合性是指 当一个操作数两侧的运算符具有相同的优先级时 该操作数是先与左边的运算符结合 还是先与右边的运算符结合 自左至右的结合方向 称为左结合性 反之 称为右结合性 结合性是 语言的独有概念 除单目运算符 赋值运算符和条件运算符是右结合性外 其它运算符都是左结合性 2 表达式求值1 按运算符的优先级高低次序执行 例如 先乘除后加减 2 如果在一个运算对象 或称操作数 两侧的运算符的优先级相同 则按 语言规定的结合方向 结合性 进行 例如 算术运算符的结合方向是 自左至右 即 在执行 a b c 时 变量b先与减号结合 执行 a b 然后再执行加c的运算 三 强制类型转换除自动转换外 语言也允许强制转换 数据类型强制转换的一般格式为 要转换成的数据类型 被转换的表达式 或 类型名 表达式 当被转换的表达式是一个简单表达式时 外面的一对圆括号可以缺省 double a 等价于 double a 将变量a的值转换成double型 int x y 将x y的结果转换成int型 float 5 2 等价于 float 5 2 将5转换成实型 再除以2 2 5 float 5 2 将5整除2的结果 2 转换成实型 2 0 int x y 将x y的值转换为int类型 int x y 将x的值转换为int类型 再与y相加 int x int x 表达式仅为一个变量时 括号可以省略 int x 注意 强制转换类型得到的是一个所需类型的中间量 原表达式类型并不发生变化 例如 double a只是将变量a的值转换成一个double型的中间量 其数据类型并未转换成double型 例 int x变量x的类型不发生变化 四 自增 自减运算符1 作用自增运算使单个变量的值增 自减运算使单个变量的值减 i 在使用i之前使i加1 i 在使用i之前使i减1 i 在使用i之后使i加1 i 在使用i之后使i减1 例 j 3 j i 先使i加1 再赋给j 执行后 j 4 i 4 j 3 j i 先把i赋给j 再使i加1 执行后 j 3 i 4 注意 1 和 只能用于变量 不能用于常量和表达式 例 5 a b defineONE1 ONE 2 和 的结合方向为 右结合 例 i i 负值运算符 和自增运算符优先级相同 i 程序功能 自增 自减运算符的用法与运算规则示例 main intx 6 y printf x d n x 输出x的初值 y x 前置运算 printf y x x d y d n x y y x 后置运算 printf y x x d y d n x y 程序运行结果 x 6y x x 7 y 7y x x 6 y 7 五 有关表达式使用中的问题说明1 在表达式中使用 或 容易出错 i 3 k i i i k值等于9 i 先使用i 再加1 执行后 k 3 3 3 9 i 6 k i i i k值等于18 i 先加1 再使用i 连续3次使i加1后 i的值等于6k 6 6 6 18 2 出现多个运算符时 编译器在处理时尽可能多的 从左到右 将若干个字符组合成一个运算符 例 i j i ji j 3 TurboC中 调用函数时 实际参数的处理顺序是从右到左 称为C调用约定 实际参数的处理顺序从左到右 称为PASCAL调用约定 例 i 3 printf d d i i 先右 i 先使用i 3 再使i加1 后左 i 现在值为4 因此 输出结果 4 3 菜单 Options Compiler Codegeneration Callingconvention 3 说明 1 自增 自减运算 常用于循环语句中 使循环控制变量加 或减 以及指针变量中 使指针指向下 或上 一个地址 2 自增 自减运算符 不能用于常量和表达式 例如 5 a b 等都是非法的 3 在表达式中 连续使同一变量进行自增或自减运算时 很容易出错 所以最好避免这种用法 3 9赋值运算与赋值表达式 一 赋值运算符 赋值符号 就是赋值运算符 它的作用是将一个表达式的值赋给一个变量 赋值运算符的一般形式为 变量 赋值表达式例如 a 3 常数3赋给变量a 常数是特殊的表达式 x 5 a b c 1 如果表达式值的类型 与被赋值变量的类型不一致 但都是数值型或字符型时 系统自动地将表达式的值转换成被赋值变量的数据类型 然后再赋值给变量 思考题 假设变量num的数据类型为float 其值为2 5 则执行 num int num 后 num的值等于多少 二 赋值时的类型转换当赋值运算符两侧的类型不同时 在赋值前进行类型转换 1 float doubleint 舍弃小数 截断 2 intfloat double 值不变 3 char 1字节 int 2字节 1 unsignedchar int 赋给int的低8位 int的高8位补0 2 signedchar int 赋给int的低8位 若signedchar的最高位是0 则int的高8位全为0 若signedchar的最高位是1 则int的高8位全为1 称为 符号扩展 4 intlongint 符号扩展 longintint 截断 5 unsignedintint 6 非unsigned数据位数相同的unsigned数据 三 复合的赋值运算符复合赋值运算符是由赋值运算符之前再加一个双目运算符构成的 复合赋值运算的一般格式为 变量双目运算符 表达式 复合赋值运算符它等价于 变量 变量双目运算符 表达式 当表达式为简单表达式时 表达式外的一对圆括号才可缺省 否则可能出错 例如 x 3 等价于x x 3 y x 6 等价于y y x 6 而不是y y x 6 C语言规定的10种复合赋值运算符如下 复合算术运算符 5个 复合位运算符 5个 四 赋值表达式由赋值运算符或复

温馨提示

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

评论

0/150

提交评论