左值和右值
-
理解这两个意思对后面的内容非常重要。C++的表达式不是左值,就是右值。在C++中可以归纳为:当一个对象被用作右值时,用的是它的对象的值(内容),当对象被用作左值时,用的是对象的身份(内存中的位置)。
- 重要的原则是,在需要右值的地方我们可以用左值代替,但是不能把右值当成左值(位置)使用。
- 赋值运算需要一个左值作为左侧运算对象,得到的结果仍然是一个左值。
- 取地址符作用在一个左值运算对象上返回一个指向该对象的指针,这个指针是一个右值。
- 内置解引用运算符,下标运算符,迭代解引用符string和vector的下标运算的求值结果都是左值。
- 内置类型和迭代器的增减符作用于左值对象,得到的还是左值。
decltype 和引用
- decltype返回表达式的类型,却不计算他们的值。
- 有些表达式将向decltype返回一个赋值语句的左值,这也一意味着表达式的结果对象可以当作一条赋值语句的左值。
int a = 0, &cj = a,*p=&a;
decltype(a) x = 0;//int
decltype(cj + 0) y = 3;//int,cj是引用
decltype(cj) y = x;//int&,cj是引用
decltype(*p) y = x;//int&,p是指针
decltype(p) y = &x;//int*,p是指针
decltype(p+0) y = &x;//int*,p是指针
decltype(p[0]) y = x; //int&,p是指针
decltype(p[0]+0) y = a;//int,p是指针!!
decltype(&p) y = &p;//int**,p是指针!!
算数运算符
![](https://img.haomeiwen.com/i15943825/b9b88d241b5aeea1.png)
算术运算符
- 运算符%俗称取余,或取模,参与取余的运算对象必须是整型。
int ival=42;
double dval=3.14;
ival%12;//正确,结果是6
ival%dval;//错误,运算对象是浮点型
-
当m,n都为整型时:
- (-m)/n和m/(-n)都等于-(m/n)
- m%(-n)等于m%n
- (-m)%n等于-(m%n)
参考:C++primer 第五版
网友评论