C++定义了一元运算符和二元运算符,作用于一个对象的运算符是一元运算符,例如&取址符,*解印符等,所以像加减等就是二元运算符。后面会说到三元运算符。(同一个符号既可以时一元运算符也可能是二元运算符,都是根据环境来判断例如*)
【资料图】
运算对象转换
在运算时即使对象的类型不同也没关系,只要他们能被转换为同一种类型就行。
例如整型可以转换为浮点型,浮点型可以转换为整型,但是指针不能转换为整型。
注意:小整数类型(bool、char、short等)通常会被提升为较大的类型主要是int型。后面将做详细介绍。
重载运算符
C++语言定义了运算符作用于内置类型和复合类型的运算对象时所执行的操作。当运算符作用于类类型的运算符对象时,用户可以自行定义其含义,因为这种自定义的过程事实上就是为已存在的运算符赋予了另一种含义,所以称之为重载运算符。(overloaded operator)
IO库的>>和<<运算符以及string对象、vector对象和迭代器使用的运算符都是重载运算符。
我们使用重载运算符时,其包括运算对象的类型和返回值的类型都是由运算符定义的,但是运算对象的个数、运算符的优先级和结合律都是无法改变的。
左值和右值
一个左值表达式的求职结果是一个对象或者一个函数,然而以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象。虽然某些表达式的求值结果是对象,但是他们是右值而非左值,可以做一个简单的归纳,当一个对象被用作左值的时候,用的是对象的值(内存),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
求值顺序
优先级规定了运算对象的组合方式,但是没有说明对象按照什么顺序求值,在大多数情况下,不会明确指定求值的顺序。
我们知道f1和f2会在执行乘法之前调用,因为乘法执行的是这两个函数的运算结果,但是我们无法知道f1和f2谁先调用。
对于没有指定执行顺序的运算符来说,如果表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为,例如<<运算符是没有明确规定何时以及如何运算对象求值的。
因为程序未定义所以他会出现我们无法预测的结果。编译器可能先运行++i也可能先求i的值。
有四种运算符明确规定了运算对象的求值顺序。
&&逻辑与:先求左值运算对象的值,只有左侧运算对象为真才继续。
||逻辑或。?:条件。,逗号。
算术运算符
优先级从上到下,优先级高的运算符比优先级低的组合更加紧密。上面所有运算符都满足左结合律,意味着当优先级相同时,按照从左向右的顺序进行组合。
注意:bool类型在运算中会被当做int型。
除法运算和取余运算
除了-m导致溢出的特殊情况,其他时候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)
这一篇的内容基本都是需要理解的而且本人也省掉了很多,所以看起来可能云里雾里,如果有兴趣还是可以自己去了解。。
关键词:
推荐阅读
关于我们 广告服务 手机版 投诉文章:435 226 40@qq.com
Copyright (C) 1999-2020 www.baiduer.com.cn 爱好者日报网 版权所有 联系网站:435 226 40@qq.com