《c语言教学资料》2基本数据类型及运算.ppt_第1页
《c语言教学资料》2基本数据类型及运算.ppt_第2页
《c语言教学资料》2基本数据类型及运算.ppt_第3页
《c语言教学资料》2基本数据类型及运算.ppt_第4页
《c语言教学资料》2基本数据类型及运算.ppt_第5页
已阅读5页,还剩142页未读 继续免费阅读

下载本文档

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

文档简介

第2章基本数据类型及运算 第2章基本数据类型及运算 本章内容 2 2标准输入输出函数 2 3运算符与表达式 2 4算术运算符与算术表达式 2 1数据类型 2 5自增自减运算符及其表达式 第2章基本数据类型及运算 2 7关系运算符和关系表达式 2 8逻辑运算符和逻辑表达式 2 9其他类型运算符和表达式 2 6赋值运算符和赋值表达式 2 11库函数 2 10表达式的运算顺序和类型转换 2 1数据类型 本节内容 2 1 2常量与变量 2 1 3整型 2 1 4实型 2 1 1标识符 2 1 5字符型 2 1数据类型 C语言数据类型 数组类型结构体类型共用体类型枚举类型 整型字符型实型 浮点型 基本类型 指针类型 构造类型 空类型 单精度型双精度型 2 1 1标识符 C程序是基本字符的序列 基本字符包括 数字 0 9 大小写字母 a z A Z 标点符号特殊字符 空格 换行 制表符等 起分隔的作用 增删空白一般不影响程序的意义 2 1 1标识符 标识符是一个字符序列 用来标识程序中用到的常量 变量 函数 数组 语句标号以及符号常量等的名称 C语言规定标识符应满足以下规则 只能由字母 下划线和数字组成第一个字符不能是数字标识符中的字母区别大小写不能使用C语言的关键字C语言中有3类标识符 关键字 系统预定义的标识符 用户标识符 2 1 1标识符 2 1 1 1关键字 C语言规定的具有特定意义的字符串 通常也称保留字 小写字母 标识数据类型 14个 int long char float double等标识存储类型 5个 auto static register等标识流程控制 12个 goto break if else continue等标识运算符 1个 sizeof 2 1 1标识符 2 1 1 2预定义标识符总是以固定的形式用于专门的地方 例如标识库函数名和编译预处理命令 编译预处理命令 define endef ifdef endif include等 标准库函数 数学函数 sqrt sin cos pow log fabs exp等 输入输出函数 scanf printf getchar gets等 2 1 1 3用户自定义标识符用户根据自己的需要定义的一类标识符 主要用于标识变量 函数 数组名等 2 1 2常量与变量 2 1 2 1常量常量是指在程序中固定不变的数据量 常量又可分为直接常量和符号常量 直接常量 就是在程序中直接引用的数据 整型常量 1 0 50 32767 实型常量 3 14 55 6 1 7e4 字符常量 A s 字符串常量 Goodmorning howareyou 2 1 2常量与变量 符号常量 是用标识符表示一个数据 定义符号常量 define标识符常量 define是一条预处理命令 称为宏定义 其功能是把该标识符定义为其后的常量值 一经定义 以后在程序中所有出现该标识符的地方均代之以该常量值 习惯上符号常量的标识符用大写字母 definePI3 14159标识符PI代表常量3 14159 程序中 凡是出现标识符PI的地方都用3 14159替换 2 1 2常量与变量 例2 1 分析以下程序中 常量有哪些 include defineN10voidmain inta 6 intsum floatb 4 5 c sum a N c b N printf a 6 sum d n sum printf f c 2 1 2常量与变量 2 1 2 2变量变量代表内存中的一个存储单元 它用来存放数据 也就是变量的值 在程序运行期间 可以读出所存放的值或写入新值 变量名实际上是一个以一个名字对应代表一个内存单元的地址 在对程序编译时由编译系统给每一个变量名分配对应的内存地址 从变量中取值 实际上是通过变量名找到相应的内存地址 从该存储单元中读取数据 2 1 2常量与变量 2 1 2 2变量C语言中要求对所有用到的变量作强制定义 也就是 先定义 后使用 在定义变量时要指定变量名和变量的数据类型 也可以同时为定义的变量赋初值 变量的数据类型决定了编译系统为其分配的空间大小 变量 先定义 后使用 的目的 未定义的 系统不作为变量名 编译时出错 编译时为变量分配相应存储单元 根据变量类型 检查运算是否合法 如整型变量的求余运算a b 2 1 2常量与变量 变量定义必须放在变量使用之前 一般放在函数体的开头部分 之后是程序的执行语句 主函数main 的结构为 main 变量声明语句执行语句序列 2 1 2常量与变量 定义变量的语句格式为 类型变量表 类型可以是int float char void或自定义类型 变量表可以是一个或多个变量名 各变量之间要用逗号分开 声明语句要以分号作为结束 intabc 声明一个名为abc的整型变量floatm n p 声明3个实型变量 名字分别为m n p定义变量的同时赋初值 floatm 1 n 2 p 应注意 在初始化中不允许连续赋值 如inta b c 5是不合法的 2 1 3整型数据 2 1 3 1整型常量 十进制整型常量 十进制整常数没有前缀 八进制整型常量 以数字0作为前缀 所用数码为0 7 八进制数通常是无符号数 例如 012 十进制为10 0103 十进制为67 0177777 十进制为65535 十六进制整型常量 十六进制整型常量以0X或0 x为前缀 所用数码为0 9 A F或a f 例如 0X1B 十进制为27 0XC2 十进制为194 0XFFFF 十进制为65535 2 1 3整型数据 长整型数的表示 在基本整型数后加大写字母 L 或小写字母 l 来表示 例如 72767L 十进制为72767 0200000L 十进制为65536 0X21FFFL 十进制为139263 等 长整型数占4个字节 32位 存储空间 整型常量的无符号数的后缀为 U 或 u 例如 625u 0 x12Du 115Lu均为无符号数 程序中是根据前缀来区分各种进制数的 整型常量后面加u或U 则认为是unsignedint型 整型常量后面加l或L 则认为是longint型 2 1 3整型数据 2 1 3 2整型变量整型变量用来存放整型常量 整型变量按其取值范围可分为以下几类 基本型类型说明符为int 在内存中占4个字节 TC编译系统为2个字节 其取值为基本整常数 短整型类型说明符为shortint或short 所占字节和取值范围均与基本型相同 长整型类型说明符为longint或long 在内存中占4个字节 其取值为长整型数 2 1 3整型数据 整型变量还可添加类型说明符unsigned 表示该变量是无符号型变量 无符号型与上述三种类型匹配可构成 无符号基本型类型说明符为unsignedint或unsigned 无符号短整型类型说明符为unsignedshort 无符号长整型类型说明符为unsignedlong 2 1 3整型数据 2 1 3整型数据 例2 2 将八进制数0100赋给变量a 十六进制数0 x1F赋给变量b 十进制数10赋值给变量c 然后计算d a b c 最后以十进制和八进制形式显示a b c d的值 includevoidmain inta 0100 b 0 x1F intc 10 d d a b c printf a db dc dd d a b c d printf n printf a ob oc od o a b c d 2 1 3整型数据 2 1 3 3整型数据在内存中的存储方式一个数分为正数和负数 在计算机中为了表示数 可以采用多种方法 一般有原码 反码 补码这三种表示形式 实际上 在计算机中 数值是用补码表示的 原码 将最高位作为符号位 以0代表正 1代表负 其余各位代表数值本身的绝对值 即转换成相应的二进制形式 我们以短整型 int 来举例 7的原码 0000000000000111 7的原码 1000000000000111 2 1 3整型数据 反码 一个数如果为正 则它的原码与反码表示方法相同 一个数如果为负 则符号位为1 其余各位是对原码取反 7的反码 0000000000000111 7的反码 1111111111111000 补码 在计算机中 数值是用补码表示的 一个数如果为正 则它的原码 反码 补码相同 一个数如果为负 则符号位为1 其余各位是对原码取反 然后整个数加1 7的补码 0000000000000111 7的补码 第一步 7的原码 0000000000000111第二步 按位取反 1111111111111000第三步 整个数 1 得 7的补码 1111111111111001 2 1 3整型数据 已知一个负数的补码 将其转换为十进制数 步骤如下 1 先将各位取反 2 将其转换为十进制数 3 加上负号 再减去1 例如 1111111111111010 最高位为1 是负数 先对各位取反得0000000000000101 转换为十进制数得5 加上负号得 5 再减1得 6 在计算机中 数值是采用补码表示的 这样做可以把减法运算转换成加法运算 仍然能获得正确的结果 使得计算机的运算器具备加法器就可以完成各种运算了 简化了计算机的硬件结构 2 1 3整型数据 计算机所能表达的数的范围叫做 模 模与某数的差 叫做某数的 补数 如果丢弃超出模的进位的话 数A减数B所得的差 与数A加数B的补数所得的和是一致的 例如 以10为模 9 4 5 9 6 15 丢掉进位也是5 如果计算机用一个字节表示数 模就是100000000 256 107 3这个减法运算就可以变成7 3的补码 253 的加法运算 00000111 7的补码 11111101 3的补码253 100000100 丢掉进位为4 2 1 4实型数据 2 1 4 1实型常量实数有两种表示形式 小数形式和指数形式 小数形式由数码0 9和小数点组成 指数形式指数形式也称科学计数法 由十进制小数加阶码标志 e 或 E 以及阶码组成 指数表示的一般形式为 aEn a为实数 n为整数 表示a 10n 注意 实型常数不分单 双精度 都按双精度double型处理 2 1 4实型数据 2 1 4 2实型变量实型变量分为两类 单精度实型和双精度实型 float为单精度说明符 double为双精度说明符 单精度型占4个字节 32位 内存空间 其数值范围为3 4E 38 3 4E 38 只能提供7位有效数字 双精度型占8个字节 64位 内存空间 其数值范围为1 7E 308 1 7E 308 可提供16位有效数字 2 1 4实型数据 includevoidmain floata doubleb a 1 0 3 b 1 0 3 printf a 20f nb 20f n a b 例2 3 编写一个程序 用float和double两种类型变量保存1 3的计算结果 2 1 5字符型数据 一个字符 占1个字节的存储空间 字节中存放字符的8位二进制的ASCII码 总共256种 对应0 255的整数 2 1 5字符型数据 2 1 5 1字符常量字符类型常量或变量都占用1个字节 字符型变量用于存放一个ASCII码 C语言是把字符型的数据当成整型数处理的 因此 对于整型数据的所有处理均可用于字符型数据 在C语言中 字符型常量是由一对单引号引起来的单个字符构成 例如 A 5 等 a 的ASCII码为 01100001 十进制97 十六进制61 2 1 5字符型数据 字符常量有以下特点 字符常量只能用单引号括起来 不能用双引号或其它括号 字符常量只能是单个字符 不能是字符串 字符常量占用一个字节的存储单元 而实际在存储单元内存放的是该字符的ASCII码值 即一个整型量 因此 字符常量可以参加数值运算 2 1 5字符型数据 includevoidmain charm a printf c n m 例2 5 分析以下程序运行结果 2 1 5字符型数据 转义字符是在一些字符前加上反斜杠 构成 用于表示某些控制字符 如 n表示回车 或一些特殊字符 表示双引号 还可以表示任意ASCII字符 bbb 0 xhh 2 1 5字符型数据 includevoidmain printf 1 t2 t3 t4 n includevoidmain printf Y b n 例2 6 输出1 2 3 4 要求以制表符 tab 分隔 例2 7 转义字符的使用 2 1 5字符型数据 includevoidmain printf 101 x42C n printf Hesaid Thankyou n printf CProgram n printf Turbo C n 例2 8 判断输出结果 字符数据在内存中的存储形式及其使用方法一个字符常量存放到一个字符变量中 即将该字符的相应的ASCII码放到存储单元中 因而字符型数据和整型数据之间可以通用 例如 charc A inty y c 32 2 1 5字符型数据 2 1 5字符型数据 2 1 5 2字符串常量字符串常量是由一对双引号括起的字符序列 例如 ABC 123 a n t nGoodmorning 等都是合法的字符串常量 字符串常量和字符常量是不同的量 它们之间主要有以下区别 字符常量由单引号括起来 字符串常量由双引号括起来 字符常量只能是单个字符 字符串常量则可以包含一个或多个字符 2 1 5字符型数据 可以把一个字符常量赋予一个字符变量 但不能把一个字符串常量赋予一个字符变量 在 语言中没有相应的字符串变量 但是可以用一个字符数组来存放一个字符串常量 这一内容将在数组一章详细介绍 字符常量占一个字节的内存空间 字符串常量占的内存字节数等于字符串中字符数加1 增加的一个字节中用来存放字符串结束标志字符 0 ASCII码为00000000 字符串 Cprogram 在内存中的存储形式为 2 1 5字符型数据 2 1 5 3字符型变量同其他类型的变量一样 必须在使用前声明 字符型变量占一个字节 字符型变量的取值是字符常量 即单个字符 类型说明符是char 例如 声明两个字符型变量 charc1 c2 在声明时 也可以直接赋初值 charc1 x c2 y charc3 c4 95 2 1 5字符型数据 字符x的十进制ASCII码是120 y的十进制ASCII码是121 对字符变量c1 c2赋予 x 和 y 值 c1 x c2 y 实际上是在c1 c2两个单元内存放120和121的二进制代码 c101111000 x c201111001 y 所以也可以把它们看成是整型量 语言允许对整型变量赋以字符值 也允许对字符变量赋以整型值 在输出时 允许把字符变量按整型量输出 也允许把整型量按字符量输出 2 1 5字符型数据 includevoidmain chartab tab t printf 1 c2 c3 c4 n tab tab tab 例2 9 判断输出结果 2 1 5字符型数据 includevoidmain intsum 0 sum sum a printf sum d n sum 例2 10 判断输出结果 2 1 5字符型数据 includevoidmain charc1 A inty y c1 32 printf c1 c d n c1 c1 printf y c d n y y 例2 11 编写一程序 将字符A赋给字符型变量c1 计算y c1 32 最后以字符和整数两种形式显示c1和y的值 2 2标准输入输出函数 本节内容 2 2 2格式输出函数printf 2 2 1格式输入函数scanf 2 2标准输入输出函数 C语言本身不提供输入输出语句 输入和输出操作是由C函数库中的函数来实现例如 字符输入函数 getchar字符输出函数 putchar格式输入函数 scanf格式输出函数 printf字符串输入函数 gets字符串输出函数 puts 2 2标准输入输出函数 在使用系统库函数时 要用预编译命令 include 将有关的 头文件 包括到用户源文件中 例如 在调用标准输入输出库函数时 文件开头应该有 include stdio h 或 include用双引号表示先在当前程序所在的目录查找所包含的文件 一般在要包含自己写的文件时使用 用尖括号表示先在系统目录查找所包含的文件 一般在要包含系统头文件时使用 2 2 1格式输入函数scanf 此处所说的数据输入指的是程序从键盘上输入数据 注意 scanf 函数的声明包含在stdio h头文件中 因此 要调用这个函数 必须在程序开始处添加 include预处理命令 2 2 1格式输入函数scanf 格式intscanf 格式化字符串 地址表 地址表 地址表是一系列要求输入数据的变量的地址 对普通变量而言 变量地址就在变量前加 变量n的地址是 n 格式化字符串 格式化字符串包括空白字符 普通字符 非空白字符 和格式说明符3部分 scanf 函数按从左到右的顺序扫描格式化字符串 对其进行处理 2 2 1格式输入函数scanf 空白字符包括空格 t 水平制表符和 n 回车换行符等 空白符将被跳过 普通字符 非空白字符 包括除百分号 以外的所有ASCII字符 普通字符必须原样输入 格式说明符用于规定所读入数据的类型 它是由百分号加特定字符组成 常用格式说明符及含义如下表 2 2 1格式输入函数scanf 2 2 1格式输入函数scanf 格式说明符按从左到右的顺序与地址表中的各参数相匹配 格式说明符的个数要与参数表中的参数个数相同 scanf d o x 2 2 1格式输入函数scanf includevoidmain inta b c sum printf Pleaseinputa b c n scanf d o x 例2 12 编写一程序 分别输入一个十进制 八进制 十六进制数 然后求这三个数之和 最后以十进制形式输出这三个数及其和 2 2 1格式输入函数scanf includevoidmain floatx y sum product scanf x fy f 例2 13 从键盘上输入任意两个数 求它们的和与积 2 2 1格式输入函数scanf includevoidmain charch printf pleaseinputaletter n scanf c 例2 14 从键盘输入一个小写字母 输出对应的大写字母 2 2 2格式输出函数printf 数据输出是指在屏幕输出 显示 数据 要调用这个函数 必须在程序开头添加 include预处理命令 格式intprintf 格式化字符串 参量表 用途可将多项字符 数值 整型或实型 和字符串格式化后 输出到标准输出设备上 2 2 2格式输出函数printf 参数说明 参量表 参量表是任选项 根据程序具体需要 可有可无 是一系列要输出的数据项 它们可以是整型 实型 字符型及字符串常量或变量 也可以是运算表达式 格式化字符串 格式化字符串是用双引号引起来的一个字符串 格式化字符串是由普通字符 转义字符 格式说明符三部分组成 2 2 2格式输出函数printf 普通字符 printf 函数将根据普通字符出现的先后次序直接照原样显示输出 转义字符 printf 函数将根据转义字符所具有的含义进行输出处理 格式说明 用来规定各项输出数据的输出类型和输出格式 通常和参量表中的表达式一一对应 printf a db dc dsum d a b c sum 2 2 2格式输出函数printf 2 2 2格式输出函数printf includevoidmain inti 64 printf i d i 以十进制格式输出printf i o i 以八进制格式输出printf i x i 以十六进制格式输出printf ni d o x n i i i 各种格式混合输出 例2 15 编写一程序 将十进制整数64以十进制 八进制和十六进制输出 2 2 2格式输出函数printf includevoidmain floatx y scanf f f 例2 16 从键盘上输入任意两个数 求它们的和与积 2 2 2格式输出函数printf 附加字符的使用对于格式说明 和格式字符之间也可以插入一些附加字符 其一般形式如下 m n l 格式规定符中括号 和 括起来的各项为任选项 它们用来限定输出数据项的格式 而格式规定符用来限定各输出数据类型 2 2 2格式输出函数printf 2 2 2格式输出函数printf includevoidmain intx 123 printf 10d x 指定左对齐 m指定宽度为10printf n printf 10d x m指定宽度为10 默认右对齐printf n 例2 17 编写程序 将整数123以10个字符宽度靠左输出和靠右输出 2 2 2格式输出函数printf includevoidmain floatx 123 456 printf x 2f n x n指定小数点后保留2位printf x 10 2f n x m指定宽度为10 例2 18 编写程序 输出数值123 456 分别按以下两种格式输出 只保留小数点后两位 按10个字符宽度 保留小数点后两位 2 3运算符与表达式 C语言的语句是由表达式构成的 因此C语言又被称为表达式语言 由于C语言含有相当丰富的运算符 因此构成的表达式也是多种多样 可以表示各种运算功能 C语言的运算符非常丰富 使用方法也比较独特 C语言有40多个运算符单目运算符 只需要一个运算对象双目运算符 需要两个运算对象参加三目运算符 需要三个运算对象参加 2 3运算符与表达式 2 3运算符与表达式 表达式是由运算符连接常量 变量 函数所组成的式子 根据运算符的不同可以把表达式分为 算术表达式 赋值表达式 逻辑表达式 关系表达式 条件表达式等 任意一个表达式最终总是可以得到一个确定的值 也就是说C表达式本质就是一个值 因此表达式中如果有变量 则该变量必须是已赋过值的 需注意的是 如果表达式中出现多个运算符 则表达式的求值顺序要按运算符的优先级和结合性的规定进行 2 4算术运算符和算术表达式 2 4 2算术表达式 2 4 3算术运算符的优先级和结合性 2 4 1算术运算符 本节内容 2 4 1算术运算符 加法运算符 减法运算符或负值运算符 乘法运算符 除法运算符 C语言的除法运算比较特殊 当两个整型数相除时 结果为整型数 其商只取整数部分 小数部分自动舍弃 而有实型数参加的除法运算 结果为double实数 要保留小数部分 2 4 1算术运算符 includevoidmain printf d d n 30 4 30 4 printf f f n 30 0 4 30 0 4 例2 20 分析以下程序结果 2 4 1算术运算符 求余运算符或称为模运算符 该运算要求运算符两边的操作数必须为整型或字符型数据 其结果 余数 也是一个整型或字符型数据 求余运算不能用于实型数 求余运算的结果等于两数相除后的余数 通常百分号左边的数比较大 结果自然就是整除后的余数 例如80 7的结果是3 结果的符号与被除数相同 2 4 2算术表达式 算术表达式是由算术运算符和圆括号将运算量 常量 变量 函数 连接起来的式子 需注意的是 C表达式中的所有字符都是写在一行上的 不能写成分式和上下标的形式 以下是一些正确的算术表达式 a b b 2 a x r 8 a b 7sin x sin y 3 14 r rb b 4 a c在程序设计中有时需要将一些特殊的数学公式写成算术表达式 需要用到C语言的库函数 y x y 调用方法为y abs x y 2 4 3算术运算符的优先级和结合性 优先级 存在混合运算的表达式中 必须规定各种运算的先后顺序 才能保证结果的唯一性 这个规定的先后顺序就是运算符的优先级 若一个运算对象两侧的运算符优先级不同 则按规定的优先级进行运算 如 a b c运算符的优先级规定见附录2 2 4 3算术运算符的优先级和结合性 结合性 是运算符的一个属性 若一个运算对象两侧的运算符优先级相同 则必须规定运算对象先与哪一侧的运算符结合 规定运算对象与左侧运算符先结合的称为 左结合性 从左向右 如 a b c即 a b c a b c即 a b c 规定运算对象与右侧运算符先结合的称为 右结合性 从右向左 如 i 即 i a 即 a 运算符的结合性规定见附录2 运算符优先级口诀 2 4 3算术运算符的优先级和结合性 算术运算符的优先级和结合性 2 5自增自减运算符及其表达式 运算符 自增运算符 自减运算符 表达式 E EE E 注 E为整型或实型变量 2 5自增自减运算符及其表达式 使用说明 自增运算符 的作用是对操作数进行增1运算 自减运算符是对操作数进行减1运算 注意 和 的运算对象只能是变量 或运算结果是变量的表达式 不能是常量 或运算结果是数值的表达式 5 a b 都是不合法的表达式 运算符 或 在操作数前 左 边的表达式称为前缀运算 在操作数后 右 边的运算称为后缀运算 x a 前缀运算n a 后缀运算 2 5自增自减运算符及其表达式 当 和 作为前缀运算符时 被运算的变量 操作数 先自增 减 1 然后该变量的新值再参加表达式中其他运算 先加后用 或 先减后用 includevoidmain inti 1 n n i printf d d n i n 例2 22 判断输出结果 2 5自增自减运算符及其表达式 当 和 作为后缀运算时 则先进行其他运算或操作 然后被运算的变量 操作数 再进行自增 减 运算 先用后加 或 先用后减 includevoidmain inti 1 n n i printf d d n i n 例2 23 判断输出结果 2 5自增自减运算符及其表达式 自增和自减运算符都具有右结合性 结合方向为从右到左 a 等价于 a 如果有多个运算符连续出现时 C系统尽可能多的从左到右将字符组合成一个运算符 i j等价于 i j i j等价于 i j 略 函数参数的求值顺序 在TC中 先计算最右边的参数值 再依次计算左边的参数值 在VisualC 6 0中 是各参数项同时取值 2 5自增自减运算符及其表达式 includevoidmain inti 1 j 1 i j printf d d n i j includevoidmain floati 9 j 3 floatm m i j printf 2f n m 例2 24 25 判断输出结果 2 5自增自减运算符及其表达式 有关表达式中的问题说明 如果对于表达式E1 E2 并不是所有的编译系统都先调用E1 然后调用E2 例如 i的初值是5 有以下表达式 i i i 在TurboC2 0下 按照自左而右顺序求解括弧内的运算 求完第1个括弧的值后 实现i的自增 i变为5 再求第2个括弧的值 结果表达式相当于5 6 7 即18 而在VisualC 6 0下把5作为表达式中所有i的值 因此3个i相加 得到的表达式的值是15 在求出整个表达式的值后再实现自加3次 i的值变为8 读者在编程时应尽量避免这种歧义性 2 5自增自减运算符及其表达式 includevoidmain inta 3 m m a a printf d d n a m VisualC 6 0将3作为表达式中所有a的值 计算后再实现2次自增 所以m的值是6 例2 27 判断输出结果 2 6赋值运算符和赋值表达式 本节内容 2 6 2赋值运算中的数据转换 2 6 3复合赋值运算符及表达式 2 6 1简单赋值运算符和表达式 2 6赋值运算符和赋值表达式 C语言提供的赋值运算符有如下三类 简单赋值运算符 复合算术赋值运算符 复合位赋值运算符 由赋值运算符将一个变量和一个表达式联接构成的式子就是赋值表达式 2 6 1简单赋值运算符和表达式 简单赋值运算符的功能是将其右侧表达式的值赋给左侧的变量 赋值表达式的一般形式为 变量名 表达式如 a 3 5 在赋值表达式中 称为赋值运算符 而不是等号 左操作数必须是变量 不能是常量或表达式 右操作数可以是常量 变量或表达式 赋值表达式的计算过程是 先计算出右操作数的值 然后赋给左边的变量 2 6 1简单赋值运算符和表达式 C语言允许在同一个赋值语句中对多个变量进行赋值 赋值运算规则是从右向左 例如 a b c 1 但是在变量定义时 只能 inta 1 b 1 c 1 表达式x a 3 b 6 在C语言中也是合法的 它的意义是把3赋给a 6赋给b 再把a b相加 和赋给x 故x应等于9 当左操作数和右操作数类型不同时 在赋值运算之前 要先将右操作数的类型转成与左操作数相同的类型 然后再进行赋值 这种类型的转换是C语言自动完成的 2 6 2赋值运算中的数据转换 当赋值运算符两边的运算量类型不同时 系统将自动进行类型转换 即把赋值运算符右侧表达式的类型换成左侧变量的类型 具体规定如下 以下略 整型与实型实型数据赋予整型变量时 舍去小数部分 只保留整数部分 整型数据赋予实型变量时 数值不变 但以浮点数据形式存储在变量中 即小数点后加若干个0 2 6 2赋值运算中的数据转换 整型与字符型整型数据赋予字符型变量时 只保留其最低8位 高位部分全部舍弃 字符型数据赋予整型变量时 由于字符型数据占用一个字节存储单元 而整型数据为两个字节存储单元 故将字符的ASCII码值放到整型变量的低8位中 高8位另作处理 分两种情况 如果系统将字符处理为无符号的数据类型 则高8位全部补0 如果系统将字符处理为有符号数据类型 若字符最高位为0 则整型变量高8位全部补0 若字符最高位为1 则整型变量高8位全部补1 叫做 符号扩展 2 6 2赋值运算中的数据转换 includevoidmain inta b 325 c floatx y 10 25 charc1 323 charc2 a y x b c c1 c2 b printf d f d c n a x c c2 例2 28 有以下程序 试分析其结果 323八翻二为11010011 赋c变量后进行符号扩展 变为 1111111111010011 但这是补码 取反变为1000000000101100 加一后为 1000000000101101即 45 325十翻二为0000000101000101 赋c2变量后丢掉高位 剩 01000101 这是 E 的ASCII码 故输出E 2 6 2赋值运算中的数据转换 单 双精度实型C语言中的实型值总是用双精度来表示的 凡是float型数据只要在其尾部加0延长为double型数据进行计算 然后直接赋值即可 而double型数据转换为float型数据时 需要截尾数 在截断前要先进行四舍五入操作 整型与长整型一个long型数据赋给int型变量时 将其低16位值赋给int型变量 而将高16位截断舍弃 一个int型数据赋给long型变量时 其外部形式不发生变化 但其内部进行符号扩展 如果原int型数据是正值 那么将int型数据送入long型变量的低16位 高16位全部补0 反之将long型变量的高16位全部补1 VC中 int型和long型长度相等 2 6 2赋值运算中的数据转换 无符号整型一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时 将其原样赋予 内部存储方式不发生任何改变 但其外部表现形式是有符号的 因此值可能会有所改变 一个非unsigned型数据赋给一个占据同样长度存储单元的unsigned型变量时 原样赋值 即内部存储形式不会改变 但其外部表现形式总是无符号的 值有时会发生改变 C语言的这种赋值时的类型转换相对灵活一些 对于许多初学者来说会觉得复杂难记 在实际调试程序的过程中经常会出现错误却又找不到问题所在 因此建议读者在编写程序的过程中尽量用强制类型转换 以便增加程序的可读性 2 6 2赋值运算中的数据转换 includevoidmain unsignedx 65535 y inta 1 b b x y a printf unsigned u int d n x b printf int d unsigned u n a y 例2 29 有以下程序 试分析其结果 2 6 3复合赋值运算符及表达式 复合赋值运算符的作用是 把一个变量的值先取出来进行运算之后再赋给该变量 例如 i 2等价于表达式i i 2的运算 复合赋值表达式的一般形式是 E1OP E2 OP为 之一 该表达式等价于 E1 E1OPE2 复合算术赋值运算符有 复合位赋值运算符将在位运算符中介绍 2 6 3复合赋值运算符及表达式 关于复合算术赋值运算的几点说明 复合赋值运算符在书写时 两个运算符之间不能有空格 复合赋值表达式中的左操作数E1必须是变量 不能是常量或表达式 右操作数E2可以是常量 变量或表达式 下列复合赋值表达式是正确的 x 2 等价于x x 2x 2 y 等价于x x 2 y 下列复合赋值表达式是非法的 2 3 x 1 5 2 6 3复合赋值运算符及表达式 复合赋值运算过程是 先计算E2的值 然后E1与E2进行相应的运算 最后结果赋给E1 注意表达式两边的括号 如a b 3等价于a a b 3 而不是a a b 3 运用复合赋值运算符这种写法 可以使语句更加紧凑 有利于编译处理 能提高编译效率并产生质量较高的目标代码 2 7关系运算符和关系表达式 本节内容 2 7 2关系表达式 2 7 1关系运算符 2 7 1关系运算符 在程序中经常需要比较两个数据量的大小关系 以决定程序下一步的工作 例如 a 3 比较的结果成立 该式取值为真 否则为假 比较两个数据量的运算符称为关系运算符 语言提供了以下关系运算符 大于 大于或等于 等于 不等于 2 7 1关系运算符 说明 关系运算符都是双目运算符 其结合性均为左结合 在六个关系运算符中 的优先级相同 并高于 和 和 的优先级相同 关系运算符的优先级高于赋值运算符但低于算术运算符 关系运算符 和赋值运算符 不同 如果关系运算的两个操作数类型不同 则低类型向高类型看齐 统一类型后 再进行关系运算 2 7 2关系表达式 用关系运算符将两个运算量连接起来构成的式子就是关系表达式 关系表达式的一般形式如下 E1OPE2关系表达式的值为逻辑值True和False 在C语言中 关系表达式运算结果的 真 和 假 是通过整型数1和0来表示的 如果关系式成立 则得到一个int类型的1值 否则运算结果得到一个int类型的0值 例如 2 12 x 5 y 2 B A 3 3 5 2 7 2关系表达式 includevoidmain inta 3 b 2 c c 2 a b a b a b printf c d n c 例2 30 31 分析以下程序结果 2 7 2关系表达式 includevoidmain chara f inti 1 j 2 k 3 floatx 2e 5 y 0 55 printf d d n a 6 a 1 printf d d n 1 j 5 x 5 25 x y printf d d n i j k 2 j k j i 5 2 8逻辑运算符和逻辑表达式 本节内容 2 8 2逻辑运算的值 2 8 3逻辑表达式 2 8 1逻辑运算符 2 8 1逻辑运算符 语言中提供了三种逻辑运算符 逻辑与 逻辑或 逻辑非与运算符 和或运算符 均为双目运算符 具有左结合性 非运算符 为单目运算符 具有右结合性 逻辑非的优先级最高 逻辑与次之 逻辑或最低 即 非 与 或 逻辑运算的优先级低于算术运算符和关系运算符 2 8 2逻辑运算的值 逻辑运算的结果同关系运算的结果一样 只有 真 和 假 两种 也是用 1 和 0 来表示 其求值规则如下 a ba b同时为真 则a b为真 否则为假 a ba b中只要有一个为真 则a b为真 只有两个量都为假时 结果才为假 aa为真 则 a为假 a为假 则 a为真 对于a和b的值 C语言认为 0为假 非0为真 2 8 2逻辑运算的值 逻辑运算规则 真值表 在判断一个逻辑量时 以0为假 非0数值为真在给出逻辑运算值时 以1为真 以0为假 2 8 3逻辑表达式 由逻辑运算符将一个或多个表达式连接起来的式子称为逻辑表达式 E1OPE2扩展开来就是3种 与运算 E1 E2或运算 E1 E2非运算 E运算符左右两边的操作数还可以是逻辑表达式 从而组成嵌套的逻辑表达式 例如 a b c 根据逻辑运算符的左结合性 上式也可写为 a b c 2 8 3逻辑表达式 几点说明 逻辑运算符两侧的操作数 除可以是 和非 的整数外 也可以是其它任何类型的数据 如实型 字符型等 在计算逻辑表达式时 只有在必须执行下一个表达式才能求解时 才求解该表达式 即并不是所有的表达式都被求解 逻辑短路 对于逻辑与运算 如果第一个操作数被判定为 假 系统不再判定或求解第二操作数 例如 c 3 4 2 8 3逻辑表达式 includevoidmain charc k inti 1 j 2 k 3 floatx 3e 5 y 0 85 printf d d n x y x printf d d n x i 例2 32 分析以下程序结果 2 9其它类型运算符和表达式 本节内容 2 9 2逗号运算符和逗号表达式 2 9 3位运算符与简单的位运算 2 9 1条件运算符和条件表达式 2 9 1条件运算符和条件表达式 条件运算符为 它是一个三目运算符 由条件运算符组成条件表达式的一般形式为 E1 E2 E3例如 a b a b 条件表达式求值规则 首先计算表达式1 若其值为真 非0 则计算表达式2 作为整个条件表达式的值 否则 计算表达式3 作为整个条件表达式的值 注意以下几点 条件运算符的运算优先级低于关系运算符和算术运算符 但高于赋值符 因此max a b a b可以去掉括号而写为max a b a b 2 9 1条件运算符和条件表达式 条件运算符 和 是一对运算符 不能分开单独使用 条件运算符的结合方向是自右至左 例如 a b a c d c d应理解为a b a c d c d 这也就是条件表达式嵌套的情形 即其中的E3又是一个条件表达式 条件表达式中E2和E3不仅可以是数值表达式 还可以是赋值表达式或函数表达式 例如 a b printf d a printf d b 条件表达式中E1的类型可以与E2和E3的类型不同 例如 3 2 a b 是合法的条件表达式 结果是 a 2 9 1条件运算符和条件表达式 includevoidmain inta 18 b 35 c 21 d 96 intmax max a b a b max max c max c max max d max d printf max d n max 例2 33 编写程序 找出18 35 21 96中的最大值 2 9 2逗号运算符和逗号表达式 在 语言中逗号 除了做分隔符外它也是一种运算符 称为逗号运算符 其功能是把若干表达式连接起来组成一个表达式 称为逗号表达式 逗号表达式的一般形式为 E1 E2 例如 a 2 b 4 c 6逗号表达式的求值过程是分别计算各个表达式的值 并以最后一个表达式的值作为整个逗号表达式的值 2 9 2逗号运算符和逗号表达式 includevoidmain inta 2 b 4 c 6 x y y x a b b c printf y d x d y x 例2 34 有以下程序 试分析其结果 2 9 2逗号运算符和逗号表达式 几点说明 逗号表达式一般形式中的表达式1和表达式2还可以是逗号表达式 即形成逗号表达式的扩展形式 E1 E2 E3 En 程序中使用逗号表达式 通常是要分别求逗号表达式内各表达式的值 并不一定要求整个逗号表达式的值 在C语言中 常见的逗号表达式是在循环语句 for语句 中 在第3章详细介绍 并不是在所有出现逗号的地方都组成逗号表达式 如在上例程序的变量说明中 逗号只是一个间隔符 在函数参数表中逗号也只是用作各变量之间的分隔符 2 9 3位运算符与简单的位运算 所谓位运算就是以二进制位为单位进行的数据处理 前面所讲的各类运算都是以字节为单位进行操作的 而在实际应用中例如系统软件 经常需要对二进制位进行操作 即按位运算 C语言和其它高级语言不同的是它完全支持按位运算 它与汇编语言的位操作有些相似 这使得 语言也能像汇编语言一样用来编写系统程序 略 2 10表达式的运算顺序和类型转换 本节内容 2 10 2类型转换 2 10 1表达式的运算顺序 2 10 1表达式的运算顺序 表达式的运算顺序是运算符的优先级与结合性决定的 2 10 1 1优先级 优先级决定了表达式中各运算符进行运算的先后顺序 优先级高的先计算 优先级低的后计算 2 10 1 2结合性 运算符的结合性规定了几个优先级相同的运算符连续出现时的计算顺序 运算符的结合性有从左到右和从右到左两种情况 结合性为从左向右的运算符 其计算顺序是从左到右逐个进行 a b c 2 10 1表达式的运算顺序 结合性为从右到左的运算符 其计算顺序是是从右到左逐个进行 例如 由于赋值运算符的结合性为从右到左 所以 a b c 1的运算顺序是从右到左 它等价于a b c 1 即先将1赋给c 然后将c赋给b 最后将b赋给a 下面这些运算符 将在后面相应的章节中介绍 优先级为1的 成员选择符 优先级为1的 成员选择符 优先级为1的 数组下标运算符 优先级为2的 取内容运算符和 取地址运算符 运算符优先级口诀 2 10 2类型转换 C语言的类型转换有3种 即表达式类型转换 赋值类型转换和强制类型转换 以下分别介绍 2 10 2 1表达式类型转换表达式类型转换是指 如果在一个表达式中有不同类型的数据混合运算 那么C语言在计算表达式时 会自动进行类型转换 待类型统一后再进行计算 例如 计算2 3 6 a 表达式类型转换的规则是 一个运算符 二元运算符 对两边不同类型的操作数进行运算之前 C语言自动先将其中低类型的操作数转换成高类型的数据 然后再进行计算 其结果也为高类型数据 2 10 2类型转换 类型的高低规定 char int long float double 横向的转换是必须的转换 即 即使两个操作数是相同类型的 也要转换 纵向的转换是两个操作数类型不同时的转换方式 2 10 2类型转换 2 10 2 2赋值类型转换赋值类型转换是指在赋值运算符右边的操作数 不管是什么类型 都要转换成与赋值运算符 左边变量相同的数据类型 如果赋值运算符右边的操作数具有较高级别的类型 则类型转换时 进行截断取整 此时可能会损失精度 inta floatb b 10 3 0 a b b的值为3 333333 a的值为3 损失了精度 2 10 2类型转换 如果赋值运算符右边的操作数类型比较低 则类型转换时 采用补齐方式 这时不会损失精度 例如 inta floatb a 9 3 b a a的值为3 而b的值为3 000000 精度没损失 2 10 2类型转换 2 10 2 3强制类型转换程序中有时需要将一些数据类型强制转换成所需类型 此时需通过类型转换运算来实现的 其格式为 类型名 操作数 类型名为char int long float double等 例如 下列语句进行了强制类型转换 inta b floatx longm m long a 强制转换

温馨提示

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

评论

0/150

提交评论