C++复习笔记
c++ primer笔记
表达式
算术操作符
操作符 | 功能 | 用法 |
---|---|---|
+ | 一元正号 | + expression |
- | 一元负号 | - expression |
* | 乘号 | expression * expression |
/ | 除号 | expression / expression |
% | 取余 | expression % expression |
+ | 加号 | expression + expression |
- | 减号 | expression - expression |
优先级是一元操作符优先级最高,其次是乘、除操作,最后是加、减操作。
关系操作符和逻辑操作符
expression || expression
以下操作符都产生了bool值。
操作符 | 功能 | 用法 |
---|---|---|
! | 逻辑非 | !expression |
< | 小于 | expression < expression |
<= | 小于等于 | expression <= expression |
> | 大于 | expression > expression |
>= | 大于等于 | expression >= expression |
== | 相等 | expression == expression |
!= | 不等 | expression != expression |
&& | 逻辑与 | expression && expression |
逻辑或 |
逻辑操作符将其操作数视为条件表达式:手先对操作数求职;如果结果为0,则条件为假(false),否则为真(true)。
-
逻辑与、逻辑或操作符
仅当逻辑与(&&)操作符的两个操作数都为true时,结果为true。
对于逻辑或(or)操作符,只要两个操作数有一个是true,结果就是true。
这里有一个短路求值的策略。
逻辑或和逻辑与总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会去求解其右操作数。例如,对于一个逻辑与运算的表达式,如果其左操作数的值为false时,不论右操作数值为true还是false,表达式结果都为false,此时就不会求解右操作数。 -
逻辑非操作符
逻辑非操作符也是将其操作数值为条件表达式,产生预期操作数值相反的条件值。 -
不应该串接使用关系操作符
如果把多个关系操作符串接起来使用,结果往往不是我们所希望的结果。例如,
if(i < j < k){
/* */
}
如果是上述这种写法,本意是使j大于i且小于k;但是实际上,只要k大于1,if中的条件表达式就一定为true。一因为此表达式会先计算i < j的值,只有0或1两个结果,然后表达式就变成了“1 < k ”或者"0 < k",所以只要k大于1,表达式就一定为真。想表达“j大于且i小于k”的含义,使用如下方式:
if(i < j && j < k){
/* */
}
- bool值字面量
bool类型可转换为任何算术类型:bool值false用0表示,true则为1。
expression | expression
位操作符
操作符 | 功能 | 用法 |
---|---|---|
~ | 位取反 | ~expression |
<< | 左移 | expression << expression |
>> | 右移 | expression >> expression |
& | 按位与 | expression & expression |
^ | 按位异或 | expression ^ expression |
按位或 |
其中异或的含义:相同为0,不同为1。
赋值操作符
赋值操作符的左操作数必须是非const的左值。
数组名是不可修改的左值,因此数组不可用做赋值操作的目标。
- 赋值操作是右结合的
int ival,jval;
ival = jval = 0;
和其他的二元操作符不同,赋值操作是具有右结合性的。当表达式含有多个赋值操作符是,从右到左结合。上面的表达式,是将右边赋值操作的结果(jval)赋值给ival。
-
赋值操作优先级很低
一般优先级低于关系操作和算术运算。 -
复合赋值操作符
一般来说有:
+= -= *= /= %= <<= >>= &= ^= |=几种操作符
a op= b 等价于 a = a op b;
自增、自减操作符
自增++、自减–操作分为前置和后置。
前置操作返回的是加1之后的值,后置操作是返回加1之前的值。
int a = 6;
int b = a++; //b = 6 后置操作先赋值后自增
int c = ++a; //c = 7 前置操作先自增后赋值
条件操作符
条件操作符是C++中唯一一个三目运算符,就意味着条件操作符需要三个操作数。用法如下:
condition ? expression1 :expression2;
其中condition是一个条件表达式。条件操作符先计算condition的值,如果值为非0,即true,则计算expression1;否则计算expression2.
等价于
if(condition){
expression1;
}else{
expression2;
}
sizeof操作符
sizeof操作符的作用是返回一个对象或者类型名的长度,返回值类型是size_t,长度单位是字节。sizeof表达式的结果是编译时的常量。
sizeof(type_name); //可以是数据类型名
sizeof(expression); //也可以是表达式
逗号操作符
逗号表达式是一组有逗号分隔的表达式,这些表达式是从左到右计算。逗号表达式的结果是其左右边表达式的值。如果最右边的操作数是左值,则逗号表达式的值也是一个左值。
new和delete表达式
new和delete表达式可以动态的创建和释放单个变量、对象或者数组。
定义变量时,必须指定其数据类型和名字。但是动态创建对象时,只需要指定其数据类型,不必为该对象命名。取而代之的是,new表达式返回指向新创建对象的指针,我们可以通过指针访问此对象:
int i; //定义一个int型变量
int *pi = new int; //动态创建一个int型变量
这个new表达式在自由存储区分配创建了一个整型对象,并返回此对象的地址,并用这个地址初始化指针pi。
- 动态创建对象的初始化
int i(1024);
int *pi = new int(1024);
string s(10,'9');
string *ps = new string(10,'9');
C++使用直接初始化规则初始化动态创建的对象。
- 动态创建对象的默认初始化
如果不提供显式初始化,动态创建的对象与在函数内定义的变量初始化方式相同。即对于类类型的对象,则用该类的默认构造函数对对象初始化;对于内置类型则无初始化。
string *ps = new string; //空字符串
int *pi = new int; //未初始化的int型变量
也可以对动态创建的对象进行值初始化
string *ps = new string(); //一个空串
int *pi = new int(); //一个int型变量值为0
cls *pc = new cls(); //设cls是一个类名
int *pi = new int;
int *pi = new int();
第一个语句的int型变量没有初始化,而第二个语句的int型变量则被初始化为0。
- 撤销动态创建的对象
动态创建的对象使用完之后,必须显式地释放掉对象所占用的内存空间。
可以通过delete表达式释放指针所指向的地址空间。
delete pi;
注意:如果指针指向的不是new分配的内存地址,则对该指针使用delete表达式是不合法的。