C++----表达式

来源:互联网 发布:微信手机商城源码 编辑:程序博客网 时间:2024/06/05 21:49

求值顺序

运算对象的求值顺序与优先级和集合率无关,在一条形如f()+g()*h()+j()的表达式中:

  • 优先级规定,g()的返回值和h()的返回值相乘
  • 结合律规定,f()的返回值先与g()和h()的乘积相加,所得结果再与j()的返回值相加
  • 对于这些函数的调用顺序没有明确规定
    所以如果这几个函数影响同一对象,则它是一条错误的表达式,将产生未定义的行为。

C++中只有4种运算符明确规定了运算对象的求值顺序,分别是&&、 ||、 ?:、 , 。

成员访问运算符

点运算符和箭头运算符都可用于访问成员,其中,点运算符获取对象的一个成员;箭头运算符与点运算符有关,表达式ptr->mem等价于ptr.mem

因为解引用运算符的优先级低于点运算符,所以执行解引用运算符的子表达式两端必加上括号。如果没有加括号,就错啦:

//运行p的成员size,然后解引用size的结果*p.size();  //错误,p是一个指针,它没有名为size的成员

移位运算符(又叫IO运算符)

移位运算符满足左结合率。几乎所有人都用过<<的重载版本来进行IO操作吧~
我们重载运算符时,其包括运算对象的类型和返回值的类型,都是由该运算符定义的;但是运算对象的个数、运算的优先级和结合律都是无法改变的。
移位运算符的优先级不高不低,介于中间:比算术运算符的优先级低,但是比关系运算符、赋值运算符和条件运算符高。

cout<<42+10;cout<<(10<42);cout<<10<42;//错误,试图比较cout和42!
原创粉丝点击