无标题
Expression
An expression os composed of one or more operands adn yields a result when it is evaluated.
Fundamentals
unary operators and binary operators. overloaded operators.
Lvalues and Rvalues: Lvalue: object identity (its location in memory); Rvalue: object’s value (its contents)
delctype: 作用于左值产生引用类型(如解指针得到的是object本身),作用于右值则产生本身。
逻辑与:&&;逻辑或:|| 都是短路求值,先计算左侧表达式的值,再判断需不需要计算右侧。
赋值运算:右结合律,返回左侧运算对象。运算优先级较低。
i++:返回原始值的副本,本身自增。
++i: 返回增加后的值。
1 | auto pbeg = v.begin(); |
The Member Access Operators
1 | class example; |
The Conditional Operator
cond ? expr1 : expr2;
条件运算符可以嵌套: finalgrade = (grade > 90) ? “high pass” : (grade < 60) ? “fail” : “pass”;
条件运算符的优先级非常低,必须写全括号
1 | cout << ((grade < 60) ? "fail" : "pass"); // print pass or fail |
The Bitwise Operators
<< >> ~ & ^ |
sizeof Operator
- sizeof (type); 返回类型占用的字节数。
- sizeof expr; 表达式字节数。
Comma Operator
- 位于右值。首先对逗号左侧的表达式求值,然后把求值结果丢掉,返回右侧表达式的值。
- 位于左值。逗号右侧为左值。
Type Conversions
In C++ some types are related to each other. When two types are related, we can use an object or value of one type where an operandof related type is ecpected. 有时不需要程序员了解,被称为隐式转换。
隐式转换条件:
- 比int小的整型值首先提升为较大的整数类型。
- 非Bool在条件判断中转换成Bool型。
- 初始化和赋值语句中,右值转换成左值的形式
- 运算中有多种类型参与,转换成同一种类型。
- 函数调用
The Arithmetic Conversions
把一种算术类型转换成另一种。
整型提升:把小整数类型转换成较大整数类型。bool,char,signed char,unsigned char,short和unsigned short等只要所有可能的值都能存在int中,都会提升为int。
无符号类型的运算对象:
- 首先进行整型提升,如果结果的类型匹配,则不需要执行后续转换。
- 如果提升后的运算对象类型,都是有符号或者无符号的,则小的类型转换成大的。
- 如果一个是有符号,一个是无符号的,且无符号的类型不小于有符号类型,则将有符号的转换成无符号的,属于强制类型转换,承担所有后果。
- 如果有符号类型大于无符号类型,结果取决于机器。
Other Implicit Conversions
- 数组名转换成指针
- 指针的转换
- 转换成Bool
- 转换成常量
- 类的类型转换
Explicit Conversions
强制类型转换(cast)cast-name
static_cast: 只要不包含底层const,都可以使用。当需要把一个较大类型的数转换成较小类型的数时,此时,告诉编译器,我们知道且不在乎潜在的精度损失。如
1 | double slop = static\_cast<double>(j) / i; |
const_cast: 只能改变运算对象的底层const,如:
1 | const char *pc; |
reinterpret_cast: 为运算对象的位模式提供较低层次的重新解释。
1 | int *ip; |
运算符优先级:多加括号。