Chapter4:表达式

时间:2023-03-10 06:59:37
Chapter4:表达式
  • 左值和右值

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

一个重要的原则是需要右值的地方可以用左值来代替,但是不能把右值当作左值使用。(13.6有例外情况)

下面是集中用到左值的情况:

1.赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果依然是一个左值;

2.取地址符作用于一个左值运算对象,返回一个指针,此指针是一个右值;

3.内置解引用运算符、下标运算符、迭代器解引用运算符的求值结果是左值;

4.内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果是左值;

ps.decltype作用于求值结果是左值的表达式得到的是一个引用类型。

  • 除法与求余:算术运算符的运算对象和求值结果都是右值

C++11新标准规定商一律向0取整(即直接切除小数部分)。

m%n的结果是m-(m/n)*n

逻辑和关系运算符的返回值是bool类型。其中,逻辑与和逻辑或都是短路求值。

赋值运算符的结果是它的左侧运算对象,并且是一个左值。结果的类型是左侧运算对象的类型。

赋值运算满足右结合律。

  • 递增和递减运算符

有两种形式:前置版本和后置版本。前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。

建议:除非必须,否则不用递增递减运算符的后置版本。

//经验
//后置递增运算符优先级高于解引用运算符
cout << *iter++<<endl;
  • sizeof运算符满足右结合律

对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有元素各执行一次sizeof并将所得结果求和。

对string对象或vector对象执行sizeof运算,只返回该类型固定部分的大小;

逗号运算符的结果是右侧表达式的值。如果右侧运算对象是左值,那么最终的求值结果也是左值。

  • 类型转换:

1.整数提升:把小整数类型提升为大整数类型;

2.无符号类型:无符号类型 op 带符号类型:如果(unsigned≥signed),那么带符号对象转换成无符号对象;如果(unsigned<signed),转换的结果依赖于机器,如果unsigned的所有值可以放到signed类型中,那无符号对象转换成有符号对象;否则,带符号对象转换成无符号对象;

3.数组转换成指针:在大多数用到数组的表达式中,数组自动传换成指针;

  • 显示转换:

static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

const_cast:只能改变运算对象的底层const。