基础

基本概念

C++定义了一元运算符和二元运算符:

  • 作用于一个对象的运算符是一元运算符:取地址符(&)和解引用符(*)
  • 作用于两个运算对象的运算符是二元运算符:相等运算符(==)和乘法运算符(*)
  • 作用于三个运算对象的的三元运算符

 一些符号既能作为医院运算符也能作为二元运算符:

* 作为一元运算符时执行解引用操作,作为二元运算符时执行乘法操作。

组合运算符和运算对象

理解运算符的优先级、结合律以及运算对象的求值顺序。

运算对象转换

  •  整数能转换成浮点数,浮点数也能转换成整数,但是指针不能转换成浮点数
  • 小整数类型(bool、char、short等)通常会被提升成较大的整数类型(主要是int)。

重载运算符

当运算符作用于类类型的运算对象时,用户可以自定义其含义。

重载运算符时,运算对象的类型和返回值都是由运算符定义的,但是运算对象的个数、运算符的优先级和结合律都是无法改变的

左值和右值

当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的文章)。

重要的原则:

  • 需要右值的地方可以用左值来代替,不能把右值当成左值
  • 当一个左值被当成右值使用时,实际使用的是它的内容(值)

运算符用到左值的:

  • 赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果也仍然是一个左值
  • 取地址符作用于一个左值运算对象,返回一个指向该运算对象的指针,这个指针是右值
  • 内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果都是左值
  • 内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果也是左值

 优先级与结合律

 解引用和指针运算:

    int ia[] = {0,2,4,6,8};//含有5个整数的数组
    int last = *(ia + 4);//把last初始化成8,也就是ia[4]的值
    last = *ia + 4;//last=4,等价于ia[0]+4

结合律对表达式产生影响的一个典型示例是输入输出运算:

    cin >> v1 >> v2;

 求值顺序

没有指定执行顺序的运算符,表达式指向并修改了同一个对象,将会引发错误并产生未定义的行为:

    int i = 0;
    cout << i << " " << ++i << endl;

求值顺序、优先级、结合律

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

  • 优先级规定,g()的返回值和h()的返回值相乘
  • 结合律规定,f()的返回值先与g()和h()的乘积相加,所得结果再与j()的返回值相加
  • 对于这些函数的调用顺序没有明确规定
posted @ 2019-05-14 20:00  CodeWithMe  阅读(183)  评论(0)    收藏  举报