第13章c语言.ppt_第1页
第13章c语言.ppt_第2页
第13章c语言.ppt_第3页
第13章c语言.ppt_第4页
第13章c语言.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

第13章运算符与表达式 2 22 2020 2 主要内容 C语言中 不同的运算符可能有不同的优先级和不同的结合方向规则不同的运算符与运算对象 常量 变量 函数 组合起来 构成不同类型的表达式运算符的相关概念 赋值运算符 条件运算符 逗号运算符 自增自减运算符及各运算符的优先级别和结合方向规则位运算 2 22 2020 3 13 1运算符与表达式 运算是对数据进行加工的过程用来表示不同运算的符号称为运算符C语言的运算符范围很广 除了控制语句和输入 输出函数外 所有的基本操作都作为运算符处理参加运算的数据称为运算对象或操作数 运算对象可以是常量 变量或函数等按照运算符需要的运算对象的个数 可将运算符划分为单目运算符 双目运算符和三目运算符对一个运算对象进行操作的运算符 称为单目运算符 对两个运算对象进行操作的运算符 称为双目运算符 对三个运算对象进行操作的运算符 称为三目运算符用运算符和圆括号将运算对象连接起来 符合C语言规则的式子 称为表达式 2 22 2020 4 表达式必有值 一个变量或一个常量是表达式 表达式必定有值 并且C语言中的值都是属于某个类型 所以表达式都有值和类型 表达式的值的类型 也称为表达式的类型 单独的一个运算对象 称为原子表达式 用运算符将运算对象连接起来 符合C语言规则的式子 称为复合的表达式 2 22 2020 5 运算符的优先级与结合顺序 一个表达式中可以有多个运算符 先执行哪个运算 由运算符的优先级及结合方向决定C语言把所有的运算符分成15个优先级别 求解表达式时 优先级高的运算符先执行一个表达式中如果包含多个相同优先级的运算符时 先执行哪个运算符则由运算符的结合方向规定大多数运算符的结合方向是自左至右的 只有三类运算符的结合方向是自右至左的 单目运算符 条件运算符和赋值运算符注 只有使用同优先级的运算符时 才考虑运算符的结合方向使用圆括号可以改变运算符的优先级和结合方向 2 22 2020 6 13 2赋值运算符与赋值表达式 变量赋值是给已经定义的变量赋一个特定的值 即 将一个数值传递给一个变量 这个过程称为赋值运算赋值运算是通过赋值运算符 进行的在C语言中 主要是整型变量 实型变量和字符型变量的赋值 枚举类型和指针类型的赋值有一定的限制 2 22 2020 7 1 赋值运算符 赋值运算符 是双目运算符 其作用是将一个表达式的值赋给一个变量被赋值的变量 必须是单个变量 不能是表达式 常量或者函数 并且被赋值的变量 必须在赋值运算符的左边ch a num int 12 2 3 2 8 x错误x y 6错误 2 22 2020 8 2 复合赋值运算 在赋值运算符 前加上一个算术运算符或位运算符 可以构成复合赋值运算符复合赋值运算也为二目运算 是C语言特有的一种运算C语言规定了10种复合赋值运算符 即 后五种复合赋值运算是关于 位运算 的 第13 6节中介绍复合赋值运算的作用是将一个变量与另外一个表达式进行算术运算或位运算 然后再赋给原来的变量 如 num1 12 num1 num1 12 num2 9 num1 num2 num2 9 num1 2 22 2020 9 3 赋值表达式 由赋值运算符或复合赋值运算符将一个变量和一个表达式连接起来的式子 称为赋值表达式赋值表达式的一般形式为变量赋值运算符表达式例如 num 3 21是一个表达式 2 22 2020 10 赋值表达式的值 赋值表达式应该具有确定的类型和值赋值表达式的求解过程为 将赋值运算符右侧的 表达式 的值赋值给左侧的变量被赋值的变量的值 即为整个赋值表达式的值 例如 赋值表达式 num 3 21 中 变量num的值为63 整个表达式的值也为63 2 22 2020 11 变量可以多次赋值 当多次给同一个变量赋值后 该变量保留最后所赋的值 例如 intnum 3 printf d n num num 4 printf d n num 则分别输出3和4 2 22 2020 12 赋值表达式的类型 被赋值变量的类型 就是赋值表达式的类型当赋值运算符两侧的数据类型不一致时 C编译系统将赋值运算符右边的数据类型转换成与左边变量相同的类型转换分为两类一类是右侧表达式的存储单元较小 被赋值变量的存储单元较大另一类是右侧表达式的存储单元较大 被赋值变量的存储单元较小 2 22 2020 13 表13 2被赋值变量的存储单元较大 2 22 2020 14 表13 3被赋值变量的存储单元较小 2 22 2020 15 4 赋值运算符的优先级和结合顺序 赋值运算符的优先级比较低 赋值运算符与对应的复合赋值运算符的优先级相同赋值运算符是按照自右至左的结合顺序进行求解的 如 num1 num2 3 是一个赋值表达式 相当于 num2 3 和 num1 num2 变量num1和num2都具有值3 整个赋值表达式的值也为3 num1 num2 3 和 num1 num2 3 等价赋值表达式中 也可以包含复合的赋值运算符num1 3 num2 2 相当于 num2 num2 2 和 num1 num1 3 num2 2 22 2020 16 赋值表达式的应用 赋值表达式加分号 即成为赋值语句将赋值表达式作为表达式的一种 使赋值操作不仅可以出现在赋值语句中 而且能够以表达式的形式出现在其他语句或函数中inta 6 printf d a 3 则输出a的值为9 既完成了赋值的作用 又实现了输出的功能 2 22 2020 17 13 3逗号运算符与逗号表达式 C语言允许用一个表达式进行计算 但有时只写一个表达式不能完成计算任务逗号运算符是C语言提供的一种比较特殊的运算符 它的作用是将两个表达式连接起来 合为一个表达式逗号表达式的一般形式为表达式1 表达式2 2 22 2020 18 1 逗号表达式的求解顺序 先求解表达式1的值 再求解表达式2的值 第二个表达式的值和类型即为整个逗号表达式的值和类型逗号运算符也称为 顺序求值运算符 num 5 num 6该逗号表达式先求解表达式1的值 得到5 此时变量num的值也为5 然后求解第二个表达式的值为30 即整个逗号表达式的值也为30 2 22 2020 19 2 逗号运算符的优先级 在C语言的运算符中 逗号运算符的优先级最低num 6 num 4求解该逗号表达式 则先求解第一个表达式的值 该表达式为赋值表达式 值为6 并且变量num得到值6再求第二个表达式 得到值24 即整个逗号表达式的值也为24 2 22 2020 20 3 逗号运算符的扩展形式 一个逗号表达式可以与另一个表达式组成新的逗号表达式逗号表达式的一般形式可以扩展为表达式1 表达式2 表达式n逗号表达式的本质是把若干个表达式连接起来使用逗号表达式不但可以得到整个逗号表达式的值 还可以得到各个表达式的值逗号表达式经常用于for循环语句中 也可以作为实际参数printf num1 d num2 d num1 2 num 3 num2 2 22 2020 21 注意 函数的实际参数是用逗号隔开的 因此 并非在任何地方出现的逗号都是逗号运算符printf num1 d num2 d num1 num2 这里的printf函数包括了三个参数 参数间的逗号只用来分隔参数 并不是逗号运算符第一个参数中 也包含了一个逗号 该逗号只是一个在屏幕上显示的普通字符 也不是逗号运算符 2 22 2020 22 printf函数中的逗号 printf函数中的逗号不是逗号运算符 所以函数中的各个表达式并不构成逗号表达式 求解时也不能按逗号表达式的求解规则运算非逗号运算符的逗号隔开的各个表达式 C语言并没有规定求解顺序已知 inti 10 printf d d i i i 1 如果按先左后右的求解表达式 输出结果为 10 11 如果按先右后左的顺序求解表达式 输出结果为 11 11 GCC和TC都是按从右至左的顺序求解这类表达式的 2 22 2020 23 13 4条件运算符与条件表达式 条件运算符是C语言中唯一的三目运算符条件表达式的一般形式为表达式1 表达式2 表达式3条件运算符包括三个表达式 符号 和 两个符号将三个表达式隔开 缺一不可 2 22 2020 24 1 条件运算符的求解顺序 表达式1 表达式2 表达式3先求解表达式1若表达式1的值为真 非0 不求解表达式3 只求解表达式2的值 并将表达式2的值作为整个条件表达式的值 若表达式1的值为假 0 则不求解表达式2的值 只求解表达式3的值 并将表达式3的值作为整个条件表达式的值 2 22 2020 25 例13 1 条件运算符的求解顺序 includeintmain intnum1 num2 while 1 printf Inputtwonumbers n scanf d d 2 22 2020 26 2 条件运算符的优先级 条件运算符的优先级高于赋值表达式 例如 max num1 num2 num1 num2 等价于max num1 num2 num1 num2先比较num1和num2两个变量的值的大小 然后把较大的值赋给变量max条件运算符的优先级低于关系运算符和算术运算符num1 num2 num1 5 num2 num2等价于 num1 num2 num1 5 num2 num2 2 22 2020 27 3 条件运算符的结合方向 条件运算符的结合方向是 自右至左 例如 x 0 1 x 0 1 0等价于 x 0 1 x 0 1 0 2 22 2020 28 4 条件表达式的其他形式 条件表达式中的表达式1的类型 可以与表达式2和表达式3的类型不同intnum num 0 a b 如果num的值是正数 则该条件表达式的值为 a 否则表达式的值为 b 条件表达式中的表达式2和表达式3 不仅可为数值表达式 也可以是其他表达式或者函数表达式 num1 0 printf d 0 num1 printf d0 num2 num2 2 22 2020 29 例13 2 条件运算符的使用 intmain intnum1 num2 printf Inputtwonumbers n scanf d d num1 num2 num1 num2 printf num1 d n num1 printf num2 d n num2 return0 2 22 2020 30 13 5自增自减运算符 自增运算符 作用是使得变量的值增加1自减运算符 作用是使得变量的值减少1自增 自减运算符各有两种不同的用法 2 22 2020 31 1 前置运算 运算符放在变量前 它使得变量的值增加 或减少 1 然后变量以变化后的值参与其他运算前置的自增和自减运算符的一般表示形式分别为 变量 变量 i j 2 22 2020 32 例13 3 前置自增自减运算符 includeintmain inti 5 j 5 printf First i d n i i printf Second i d n i printf Third i d n i printf Fouth i d n i printf First j d n j j printf Second j d n j printf Third j d n j printf Fouth j d n j return0 2 22 2020 33 2 后置运算 运算符放在变量的后面 使得变量先参加其他运算 然后使得变量的值增加 或减少 1后置的自增和自减运算符的一般表示形式分别为变量 变量 i j 2 22 2020 34 例13 4 后置自增自减运算符 includeintmain inti 5 j 5 printf First i d n i i printf Second i d n i printf Third i d n i printf Fouth i d n i printf First j d n j j printf Second j d n j printf Third j d n j printf Fouth j d n j return0 2 22 2020 35 3 自增自减运算符的优先级与结合方向 自增运算符和自减运算符 都只能用于变量 而不能用于常量或者表达式 16 a b i 同一个表达式中 允许一个变量连续进行自增和自减运算 但在不同的系统下求解的结果不同设inti 0 i i TurboC按照自左至右的顺序求解括号里面的运算 首先计算第一个括号的值为0 但i的值变为1 然后计算第二个括号的值为1 但i的值变为2 故整个表达式的值为1而GCC等系统把i的初值0作为表达式中所有i的值 因此两个i相加 得到表达式的值为0 然后再对表达式中两个括号中的自加运算分别处理 i的值变为2 2 22 2020 36 例 inta 12 在TC环境下 a a a a 问a 此表达式的计算步骤如下 先进行 a a a 的运算 它相当于a a a a 12 12 12 12 144 132再进行 a 132 的运算 它相当于a a 132 132 132 132 132 264 2 22 2020 37 例子 若a 1 b 2 c 3 d 4 m 1 n 3 则逻辑表达式 m a b n c d 执行后 m 0 n 3因为 赋值表达式 m a b 的值为0 无论表达式 n c d 的值为真还是为假 整个逻辑表达式 m a b n c d 的值均为0 所以表达式 n c d 不被求解 变量n保持了原来的值3 x 0 0 y x 1 0当x为0时 这个表达式仍然可以计算 不会出现 除0错误 2 22 2020 38 例子若inta 0 b 1 则 a b 执行后 a b的值为多少 a 1 b 2a b 执行后 a b的值为多少 a 1 b 0a b 执行后 a b的值为多少 a 2 b 2a b 执行后 a b的值为多少 a 0 b 0对于a b 因为二义性的原因 有的系统不支持 2 22 2020 39 例子若inta 0 b 1 c 2 则 逻辑表达式a b c 执行后 a 1 b 1 c 2 表达式的值为0逻辑表达式 a b c 执行后 a 1 b 2 c 3 表达式的值为1逻辑表达式 a b c 执行后 a 1 b 0 c 2 表达式的值为0逻辑表达式a b c 执行后 a 1 b 2 c 2 表达式的值为1 a 为后置 2 22 2020 40 例子若inta 0 b 1 c 2 则 逻辑表达式 a b c 执行后 a 1 b 1 c 2 表达式的值为1逻辑表达式a b c 执行后 a 1 b 0 c 3 表达式的值为1逻辑表达式a b c 2 执行后 a 1 b 2 c 0 表达式的值为0逻辑表达式a b c 2 执行后 a 1 b 1 c 0 表达式的值为0逻辑表达式 a b c 2 执行后 a 1 b 2 c 2 表达式的值为1 2 22 2020 41 13 6位运算 赋值运算 条件运算 逗号运算 自增自减运算 关系运算及逻辑运算等 都是以字节 Byte 为基本单位进行的在很多系统中 有时需要在位 bit 一级进行运算或数据处理C语言提供了位运算的功能 使得C语言也能像汇编一样用来编写系统程序 从而使C语言既具有高级语言的特征 又具有低级语言的特征 2 22 2020 42 1 位运算符 C语言提供了6种位运算符 2 22 2020 43 2 位运算的功能 进行位运算的数据只能是整型或字符型的数据实型数据不能进行位运算 2 22 2020 44 1 按位与 运算符 按位与 运算是双目运算 结合方向为自左至右功能 两个运算数对应的二进制位相 与 按位与 运算时 当且仅当对应的两个二进制位均为1时 结果的相应位才为1如 计算23 12时 可以写为算式 00010111 0000110023 12的结果为400010111为23的二进制补码00001100为12的二进制补码00000100 4的二进制补码 2 22 2020 45 按位与运算的主要作用 1 按位与 可以将一个单元中的数清零 即 将该数的二进制位全部变为0选择一个符合以下条件的数 待清零数中为1的位 选择的数的相应位为0 满足该条件的数可能不唯一 将待清零数与选择数进行 运算 得到的数即为清零后的数 如 原有数 01100011 则可以选取 10001000 然后进行 运算2 按位与 可以截取一个数中的某些指定位 2 22 2020 46 intmain intnum scanf d num printf d num 255 return0 例13 5 将一个整数的高8位清零 其中 十进制整数1754的二进制形式为 0000011011011010 2 为了截取得到其低8位 只需要将其高8位清零 高8位清零后变为 0000000011011010 2 即十进制的218 通过 按位与 运算 也可以截取某个整数 得到其高8位 2 22 2020 47 按位与运算的主要作用 3 按位与 可以将一个数中的特定位保留下来 并使得其他位变为0选取一个数 该数中相应的特定位为1 其他位为0将选择的数与原来的数进行 运算 运算的结果 即保留了原数的特定位如 欲保留 11001001 的偶数位 并使其奇数位变为0 可以选取 01010101 然后对两个数进行 运算 结果为 01000001 2 22 2020 48 2 按位或 运算符 按位或 运算 是双目运算 结合方向为自左至右功能 两个运算数对应的二进制位相 或 按位或运算时 当且仅当对应的两个二进制位均为0时 结果的相应位才为0如 计算23 12时 可以写为算式 00010111 0000110000010111为23的二进制补码 00001100为12的二进制补码 00011111为31的二进制补码即 23 12的结果为31 按位或 运算常用来对一个数据的某些特定位置为1如 a是一个整数 计算a a 0377则a的低8位全部置为1 高8位保留原数的相应位 2 22 2020 49 3 按位异或 运算符 按位异或 运算 是双目运算 结合方向为自左至右功能 两个运算数对应的二进制位相异或 按位异或运算时 当且仅当对应的二进制位相异时 结果为1如 计算23 12时 可以写为算式 00010111 23的二进制补码 00001100 12的二进制补码 00011011 27的二进制补码 即23 12的结果为27 2 22 2020 50 按位异或运算的主要作用 1 使特定位翻转 选择一个数 其特定的位为1 其他位为0 然后将待翻转位的数与选择数进行 运算设有 01101100 欲使其高5位翻转 则可以将该数与 11111000 异或 得到 10010100 2 与0相 保留原值00010111 23的二进制补码 00000000 0的二进制补码 00010111 23的二进制补码 2 22 2020 51 按位异或运算的主要作用 3 不用临时变量 交换两个值设有两个变量 其中 num1 5 num2 6 欲交换num1和num2的值 并且不引入新的变量 则可以用 运算来实现 num1 num1 num2 num2 num2 num1 num1 num1 num2 由前两个赋值语句 num2 num2 num1 num2 而num2 num1 num2 等价于num1 num2 num2 由于任何一个数与本身相异或 结果都为0 因此 有num2 num1 0 即num2得到了num1的值 求解第三个赋值语句时 由于 num1 num1 num2 和 num2 num1 所以有num1 num1 num2 num1 即num1 num2 2 22 2020 52 4 按位取反 运算符 按位异或 运算 是单目运算 结合方向为自右至左功能 对运算数的二进制位按位求反 即 将0变为1 将1变为0 00010101 的结果为11101010 运算符的优先级高于算术运算符 关系运算符 逻辑运算符和其他位运算符计算 num1 num2 先计算 num1 然后进行按位与 运算 2 22 2020 53 5 左移运算符 左移 运算 是双目运算 结合方向为自左至右功能 把 左边的运算数的各二进制位依次左移 移动的位数由 右边的运算数指定移位过程中 高位溢出丢弃 低位补0如 计算17 2 即将 00010001 左移两位 得到01000100 即68左移运算比乘法运算速度快得多 2 22 2020 54 6 右移运算符 右移 运算 是双目运算 结合方向为自左至右功能 把 右边的运算数指定一个数右移1位相当于除以2 右移n位相当于除以2n移位过程中 低位移出被丢弃对于无符号数 高位补0 对于有符号数 并且原来的符号位为1 即原数为负数时 则左边移入0还是1 取决于所用的计算机系统移入0的称为 逻辑右移 即简单右移 移入1的称为 算术右移 TurboC采用的是算术右移 即 对于有符号数右移时 如果符号位原来为1 则左边移入高位为1 2 22 2020 55 3 位运算赋值运算符 位运算符与赋值运算符可以组合成为复合赋值运算符C语言各定义了5种

温馨提示

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

评论

0/150

提交评论