6.C Primer Plus 5.2基本运算符
5.2基本运算符
5.2.1赋值运算符:=
c语言中,“=”并不表示相等,而是一个赋值运算符。
1.左值
左值是c语言中的术语,用于标识特定数据对象的名称或者表达式,是用于标识或定位存储位置的标签。
早期C语言,左值意味着:
1.它指定一个对象,所以引用内存中的地址;
2.它可用在赋值运算符的左侧,左侧中的l源自left。
现在,标准中新增了const限定符。const创建的变量不可修改,因此这些左值不能放在赋值运算符左侧
因此,标识和定位存储位置的标签被称为可修改的左值,赋值运算符的左侧应该是可修改的左值,最好使用术语对象定位值。
2.右值
右值指的是能赋给可修改左值的量,且本身不是左值。
右值可以是常量、变量或者其他可求值的表达式(如,函数调用)。实际上,当前标准在描述这一概念时使用的是表达式的值,而非右值。
3.数据对象
被称为“项”(如,赋值运算符左侧的项)的就是运算对象。运算对象是运算符操作的对象。
例如,把吃汉堡描述为“吃”运算符“汉堡”运算对象。类似地可以说,赋值运算符的左侧运算对象应该是可修改的左值。
4.运算符
基本运算符、其他运算符(size of 运算符 和size—t类型、求模运算符、递增运算符、递减运算符)
5.2.2加法运算符:+
加法运算符用于加法运算,使其两侧的值相加。
相加的值(运算对象)可以是变量,也可以是常量。
5.2.3减法运算符:-
减法运算符用于减法运算,使其左侧的数减去右侧的数。
+和-运算符作为加法或减法运算符是都被称为二元运算符,即这些运算符都需要两个运算对象才能完成操作。
5.2.4符号运算符:-和+
减号还可用于表明或改变一个值的代数符号,以这种方式使用的负号被称为一元运算符。一元运算符只需要一个运算对象。
C90标准中新增了一元+运算符,它不会改变运算对象的值或符号,只能用于某可算出结果的表达式或者常量、变量的前面,这样编译器不会报错。但是在以前,这样做是不允许的。
注意:负号(-)和正号(+)即可用于一元运算符,也可用于二元运算符。如下三种示例:

5.2.5乘法运算符:*
在C语言中,符号*表示**乘法。

输出结果为:

指数增大:

输出结果为:

5.2.6除法运算符:/
在C语言中使用符号/来表示除法。符号/左侧的值是被除数,右侧的值是除数,例如 four = 12.0/3.0,four的值为4.0。
注意:1.整数除法和浮点数除法不同。
2.浮点数除法的结果是浮点数,而整数除法的结果是整数。
3.整数是没有小数部分的数,例如5/3的结果,因为实际结果会有小数部分。在C语言中,整数除法结果的小数部分被丢弃,这一过程被称为截断。
”混合类型“即浮点值除以整型值。C语言相对于其他一些语言而言,在类型管理上比较宽容。不过,一般情况下还是要避免使用混合类型。
注意,整数除法会截断计算结果的小数部分(丢弃整个小数部分),不 会四舍五入结果。混合整数和浮点数计算的结果是浮点数。
实际上,计算机不能真正用浮点数除以整数,编译器会把两个运算对象转换成相同的类型。 本例中,在进行除法运算前,整数会被转换成浮点数。
进行负数的整数除法,有两种方法:
1.舍入过程采用小于或等于浮点数的最大整数。
2.另一种舍入方法是直接丢弃小数部分。这种方法被称为“趋零截断”,即把-3.8转换成-3。在C99以前, 不同的实现采用不同的方法。
5.2.7运算符优先级
执行各种操作的顺序很重要。C 语言对此有明确的规定,通过运算符优先级来解决操作顺序的问题。每个运算符都有自己的优先级。正如普 通的算术运算那样,乘法和除法的优先级比加法和减法高,所以在加减法和乘除法同时存在时先执行乘法和除法。
如果同一优先级的运算符它们处理同一个运算对象,则根据它们在语句中出现的顺序来执行。对大多数运算符而言,这种情况都是按从左到右的顺序进行(=运算符除外)。
可以用表达式树来表示求值的顺序,表达式树演示了如何从最初的表达式逐步简化为一个值。
如果想让加法运算在乘法运算之前执行,则可以给加法运算部分加上圆括号,最先执行圆括号中的部分。圆括号内部按正常的规则执行。
运算符的优先级总结

注意:正号(+)和负号(-)的两种不同的用法。结合律栏列出了运算符如何与运算对象结合。一元负号与它右侧的量相结合,在除法中 用除号左侧的运算对象除以右侧的运算对象。
5.2.8优先级和求值顺序
运算符优先级为表达式中的求值顺序提供重要的依据,但是并没有规定所有的顺序。
**当运算符共享一个运算对象时,优先级决定了求值顺序。

根据运算符的优先级,乘法的优先级比加法高,所以先进行乘法运算。但是,优先级并未规定到底先进行哪一个乘法。C 语言把主动权留给语言的实 现者,根据不同的硬件来决定先计算前者还是后者。可能在一种硬件上采用 某种方案效率更高,而在另一种硬件上采用另一种方案效率更高。上述示例中无论采用哪种方案,表达式都会简化为 72 + 100,所以这并不影响最终的结果。结合律只适用于共享同一运算对象运算符。两个*运算符并没有共享同一个运算对象,因此从左往右的结合律不适用于这种情况。
注意:圆括号的优先级最高,因此求值顺序最前。
如下程序示例:

输出结果为:

注意:在编写代码过程中尽量不要使用嵌入式赋值,原因:1.不利于阅读 2.容易产生错误
例如:


浙公网安备 33010602011771号