- 零基础入门学习C语言:带你学C带你飞
- 小甲鱼
- 1873字
- 2021-03-27 17:34:00
1.17 运算符
视频讲解
几乎每一个有意义的程序都需要进行计算,写代码设计程序,就是为了告诉计算机如何对数据进行加工处理,最后得到想要的结果。
C语言通过提供大量的运算符来支持我们对数据进行处理,前边将一个值存放到变量中,使用的是赋值运算符,就是等号(=)。对字符串中的某个字符进行索引,则是将方括号([ ])作为下标运算符来实现。这一节来谈谈C语言中最常用的运算符——算术运算符。
1.17.1 算术运算符
C语言支持的算术运算符见表1-6。
表1-6 算术运算符
这里有以下几点需要注意。
(1)因为键盘上没有乘号和除号两个按键,所以用星号(*)和斜杠(/)代替。
(2)对于整数间的除法采取直接舍弃小数部分的方式,而不是四舍五入。
(3)对于浮点数间的除法则能获得一个相对逼近结果的值(如果除不尽或位数特别多的话)。
(4)百分号(%)表示求余数的意思,但求余运算符要求两边的操作数都要是整数,其结果也是整数。
1.17.2 目
表1-6中有些运算符后边写“双目”,有些写“单目”,那么到底什么是“目”呢?
我们把被运算符作用的运算对象称为操作数,如1+2,那么1和2就是被加法运算符(+)作用的两个操作数。
一个运算符是双目运算符还是单目运算符,就是看它有多少个操作数。加号(+)作为加法运算符使用的时候,它有两个操作数,称为双目运算符;但是,表示正号(+)的时候,它只有一个操作数,称为单目运算符。
C语言除了单目运算符、双目运算符,还有唯一的一个三目运算符,就是有三个操作数,这个稍后再介绍。
1.17.3 表达式
用运算符和括号将操作数连接起来的式子,称为表达式,下面是几个表达式的例子:
·1+1
·'a'+'b'
·a+b
·a+'b'+pow(a, b) * 3 / 4+5
表达式可以很简单(像1+1),也可以很复杂(像a+'b'+pow(a, b) * 3 / 4+5)。那么涉及复杂的表达式,就需要讨论计算的先后顺序问题了。对于算术运算符构成的表达式,只需要用到小学的数学知识就足够了——先乘除,后加减。但如果一个表达式内存在多种不同的运算符,那么就需要考虑到运算符的优先级和结合性的问题。
1.17.4 运算符的优先级和结合性
表1-7列举了C语言所有运算符的优先级和结合性。
表1-7 运算符的优先级和结合性
优先级和结合性共同决定了在同一表达式中运算的先后顺序。表1-7中优先级的数字越小,说明其优先级越高。表示正、负号运算符的优先级要高于加、减、乘、除和求余运算符,赋值运算符的优先级则要低于算术运算符。请看下面例子:
程序实现如下:
代码分析:
这是一个完整的语句,用分号(;)表示语句结束。其中有两个运算符,分别是赋值运算符(=)和加号运算符(+)。由于赋值运算符的优先级要比算术运算符低,因此先将1和2两个操作数相加,再将其结果赋值给变量i。
同样道理,乘号运算符(*)的优先级高于加号运算符(+),于是先计算2 * 3的值,再与1相加,最后才赋值给变量j。
经过上面两个语句的计算,变量i和j的值是3和7;负号运算符的优先级大于加号运算符,并且结合性是“右向左”,所以得到的值是-1;最后还有一个函数,函数的作用就是帮我们实现一个功能,如printf函数用于打印格式化字符串,而这里的pow函数则是计算2的3次方,然后将结果返回。这里可以直接将pow(2, 3)看成是它返回的结果,也就是8。所以,整个表达式就是k=3+7+(-1)+8,这就变成了由3个加号运算符和4个操作数组成的表达式。算术运算符的结合性都是“左向右”,因此先计算3+7的和,再加上-1,最后加上8,结果是17。
1.17.5 类型转换
大家有没有想过这样一种情况:当一个运算符的几个操作数类型不同时会发生什么,如1+2.0,很多读者朋友会脱口而出“答案是3!”,我当然知道答案是3,但它的数据类型是什么呢?是整型还是浮点型?
当一个运算符的几个操作数类型不同时,编译器需要将它们转换为相同的数据类型才能进行运算。通常情况下,编译器会将占用“坑位”较小的操作数转换为占用“坑位”较大的操作数的数据类型,再进行运算。这样做是为了确保计算的精确度。
当遇到类似1+2.0这种两种不同数据类型的操作数的运算时,编译器首先将1转换为浮点型1.0,然后再与2.0相加,得到同样为浮点型的结果3.0。
请看下面例子:
程序实现如下:
如果以%d整型的格式打印,那么输出的结果是0,这是由于printf指定了错误的输出格式导致的,而用%f可以正确地打印出结果3.0。
除了编译器帮助自动转换不同类型的操作数之外,C语言还允许强制转换操作数的数据类型。做法就是在操作数的前面用小括号将目标数据类型括起来,代码修改如下:
现在就可以使用%d打印计算结果了,程序实现如下:
再讨论一种情况,如果待转换的操作数是1.8,那么转换后的结果应该如何?将代码修改如下:
程序实现如下:
结果并没有像大家期望的那样“四舍五入”,因为C语言的做法是直接去掉小数部分的值。