1、第3章数据运算 大学C语言实用教程 计算机的基本功能是进行数据处理 而数据处理主要是通过对表达式的计算完成的 表达式是将运算量用运算符连接起来组成的式子 其中运算量可以是常量 变量或函数 由于运算量划分为不同的数据类型 每一种数据类型都规定了自己特有的运算或操作 这就形成了对应于不同数据类型的运算符集合及其相应的求值规则 必须连接两个运算量的运算符称为二元运算符a ba ba b只连接一个运算量的运算符称为一元运算符 aa b 3 1算术运算 1 算术运算符 用算术运算符连接数值型的运算量而得到的式子 5 3 6 4 2 1 a b a b a b c 1 求余运算的规则假设两个整数分别为a和
2、b 则a b a a b b8 3 2 8 3 2 8 3 2 8 3 2 2 自加 加1 自减 减1 运算 i表示i i 1 i表示i i 1 2 算术表达式 或 可以用于前缀 也可以用于后缀 n表示先令n n 1 然后取n的值 先运算后变化n 表示先取n的值 然后令n n 1 先运算后变化 如果前缀或后缀运算形成一条语句 其运算结果是相同的 例如 设i 5 则i 及 i 运算后 i的值均为6 100101101100 例 加1和减1运算 includevoidmain inta 100 printf d n a printf d n a 前缀printf d n a 后缀printf d
3、n a i i 5 6 4 3a b c 用圆括号可以提高某个运算符的优先级或结合性 但不允许使用方括号或花括号 x y s a 4 5 32与 x y s a 4 5 32 3 算术表达式求值规则 1 算术运算符的优先级和结合性 优先级 不同的运算符同时出现在表达式中时 进行运算的优先次序 结合性 同一优先级的运算符同时出现在同一表达式中时 进行运算的顺序 例 算术表达式计算优先级和结合性规则 includevoidmain inta 3 b 5 c 15 d 2 printf d n 6 a b c d printf d n a a printf d n a C编绎系统先将所有的char和
4、shortint都转换成int 所有的float都转换成double 如果表达式中只含同类型的运算量 则直接进行运算 运算结果即表达式的值也是同类型的 3 2值为1 整型 3 0 2 0值为1 5 双精度型 A B 值为131 int 型 如果表达式中含有不同运算类型的运算量 先将精度较低的运算量转化成精度较高的类型 再与精度较高的运算量进行运算 得到的运算结果为精度较高的类型 2 自动类型转换规则 例 算术表达式计算自动类型转换规则 includevoidmain charch a inti 5 unsignedintj 6 longintk 12 floatf 3 0 doubled 6
5、0 printf lf n ch i i k j k f d f i 38 500000 ch i i k j k f d f i int long long double doubledouble long double double double 表达式ch i i k j k f d f i 中含有多种类型的变量 根据优先级和结合性规则及自动类型转换规则进行计算 计算过程如图所示 3 强制类型转换规则 当算术表达式中需要违反自动类型转换规则 或者说自动类型转换规则达不到目的时 可以使用强制类型转换 其格式为 类型关键字 表达式 double a强制将变量a转换成double型 int x
6、 y 强制将表达式 x y 转换成int型 int x y强制将变量x转换成int型 然后与y相加其中包围类型关键字的圆括号必不可少 使用强制应注意以下几点 1 在进行强制类型转换时 类型关键字必须用括号括住 例如 int x不能写成intx 2 在对一个表达式进行强制类型转换时 整个表达式也应该用括号括住 例如 float a b 若写成 float a b就只对变量a进行了强制类型转换 3 在对变量或表达式进行了强制类型转换后 并不改变原变量或表达式的类型 例如 设x为float型 y为double型 则 int x y 为int型 而x y仍然是double型 4 将float型或dou
7、ble型强制转换成int型时 对小数部分是四舍五入还是简单地截断 取决于具体的系统 VC 采用的是截断小数的办法 2 5000001VC 对高精度类型转换乘低精度类型增强了检查能力 因此 对float型变量用double型常数初始化将给出警告 例 算术表达式计算强制类型转换规则 includevoidmain inta 7 x 3 y 2 floatb 2 5F c 4 7F z 3 5F printf f n b a 3 int b c 2 4 printf d n x y 2 int b int z 3 2赋值运算 1 赋值运算符和赋值表达式v e 赋值语句v e 赋值表达式赋值运算符 前
8、五种复合赋值运算符具有算术运算和赋值的双重功能 后五种复合赋值运算符则具有位运算和赋值的双重功能 2 赋值表达式的值和类型在赋值表达式中 被赋值的变量得到的值就是赋值表达式的值 而被赋值的变量的类型就是赋值表达式的类型 例如 在形如v e的赋值表达式中 变量v的值就是该赋值表达式的值 变量v的类型也就是赋值表达式的类型 includevoidmain inta 1 unsignedintb b a 低精度转换成高精度printf d u n a b includevoidmain inta charb floatc c 2 5 高精度转换成低精度b c 高精度转换成低精度a b 低精度转换成高
9、精度printf d d 1f a b c 2 2 2 5 14294967295 3 赋值表达式中的数据类型转换在v e这样的赋值表达式中 当v和e的数据类型不一致时 C编译系统自动将e的类型转换成与v相同的类型后再赋值 例3 5 3 6 赋值表达式中的数据类型转换 264 例3 7 复合赋值运算符和赋值表达式作为运算量 includevoidmain inta 12 a a a a a a a a a a a 赋值表达式作为运算量printf d n a 3 3逗号运算 1 逗号运算符 顺序运算符 用逗号运算符将几个表达式连接在一起就构成逗号表达式 a 3 5 a 4 a 5 t a a
10、b b t 2 逗号表达式的值逗号表达式中最右边的一个表达式的值视为逗号表达式的值 inta 5 a 3 5 a 4 a 5 该逗号表达式的值 inta 5 a 3 5 a 4 a 5 该赋值表达式的值 例 逗号运算符及逗号表达式 includevoidmain intc 5 printf d d d n c c c 8 c c 5 printf d n c c c 8 c c 5 printf d n c c c 8 c 1 用一个逗号表达式语句可代替多个赋值语句 如a 0 b 1 c 2 可写成a 0 b 1 c 2 2 用一个逗号表达式语句可得到多个计算结果 如y 10 x y y 5
11、60 y 执行后 x的值为12 y的值为5 3 当某些语法位置只允许出现一个表达式时 用逗号表达式可实现多个表达式的运算 例如后面要介绍的for循环 for i 0 j 0 i 8 j 10 i j 中的三个语法位置 循环变量赋初值 循环终止条件判断和循环变量增值都只允许一个表达式 用逗号表达式可实现两个或多个表达式的运算 3 逗号表达式的应用 1 关系运算符 3 4关系运算和逻辑运算 2 关系表达式 1 用一个关系运算符连接两个算术或赋值表达式a b c dx yscore 90 2 用 或 连接两个关系表达式x y y za b c d关系表达式的值是一个逻辑值 逻辑真和逻辑假 逻辑真 1
12、printf d 32 25 逻辑假 0printf d 25 32 例 关系表达式的计算 includevoidmain intx 8 y z y z x printf d x y z x 1 x y z printf d x printf d n x y z 011 3 逻辑运算符 4 逻辑表达式 用逻辑运算符连接关系表达式或任意数值型表达式 charch a intx 5 ch A ch a ch 0 x x 025 3其值得10 356其值得1 23 其值得0 1 例 逻辑表达式的计算和逻辑表达式的值 include defineEOF1voidmain inta 3 b 4 c 5
13、printf d n 3 a b c 逻辑表达式的特殊计算问题 形如 表达式1 表达式2 的逻辑表达式计算到第一个为逻辑假的表达式 就可判定整个逻辑表达式为逻辑假 其后的表达式将不被计算 形如 表达式1 表达式2 的逻辑表达式时计算到第一个为逻辑 真 的表达式 就可判定整个逻辑表达式为逻辑 真 其后的表达式将不被计算 例 逻辑表达式中的特殊计算规则 includevoidmain inta 1 b 2 c 3 d 4 m 2 n 2 m a b 02 3 5测试数据长度运算 C语言并不规定各种类型的数据占用多大的存储空间 这与宿主机器的硬件特性有关 为了能够确定某一种类型数据的长度 C语言提供
14、了测试数据长度运算符sizeof 它的一般格式为 sizeof exp 其中 exp可以是类型关键字 变量或表达式 其功能是给出exp所代表的数据类型 变量或表达式占用的内存字节数 sizeof double sizeof x sizeof a b sizeof 3 1 46 7 28 sizeof是一元运算符 它的优先级与 等相同 结合性为从右至左 例 用sizeof测试VC 6 0中各种数据类型的长度 includevoidmain charch a intx 5 y 6 floata 1 28f b 3000 0f printf char d n sizeof ch printf sho
15、rtint dint dlongint d n sizeof shortint sizeof int sizeof longint printf float d n sizeof a printf double dlongdouble d n sizeof double sizeof longdouble printf intexpress d n sizeof x y printf floatexpress d n sizeof a b printf characterexpress d n sizeof a 0 C编译系统在标题文件math h中定义了众多的数学函数 当需要调用这些数学函数时 要用 include 命令行包含该标题文件 下面列出的函数中 自变量x和y为double型 n为int型 所有的函数值均为double型 三角函数的自变量以弧度为单位 反三角函数的函数值以弧度为单位 3 6常用数学函数 知识点本章 知识点1 运算符的优先级和结合性知识点2 算术表达式知识点3 赋值表达式知识点4 关系表达式和逻辑表达式知识点5 逗号表达式知识点6 条件表达式知识点7 测试数据长度运算符