一、算术操作符
一元操作符优先级别最高,其次是乘、除操作,接着是二元的加、减法操作。当操作符的优先级一样时,一般是从左到右依次与操作数结合。
如果两个操作数为正,除数(/)和求模(%)操作的结果也是正数(或零),如果两个操作数都是负数,除法操作的结果为正数(或零),求模操作的结果则为负数(或零)。如果只有一个操作数为负数,这两种操作的结果(求模结果)取决于机器,除法操作的值则是负数或者零。
二、关系操作符和逻辑操作符
逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。称为:短路求值。
三、位操作符
位操作符将其整形操作数视为二进制位的集合,为每一位提供检验和设置的功能。
1、对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
2、常犯的错误是把位与操作(&)和逻辑与操作(&&)混淆。同样的为或操作(|)和逻辑或操作(||)也容易混淆。
四、赋值操作符
赋值操作符的左操作数必须是非const的左值。
int i,j.ival;
const int ci = i;
1024 = ival; //error
i+j = val; //error
ci = ival; //error
数组名是不可修改的左值:因此数组不可用作赋值操作的目标,而下标和解引用操作符都返回左值。当将这两种操作用于非const数组时,其结果可作为赋值操作的左操作数。
int ia[10];
ia[0] = 1; //ok
*ia = 1; //ok
1、赋值操作符具有低优先级
int i=get_value();
while((i=get_value()) != 42)
{
i = get_value();
}
在赋值操作上加括号是必须的,因为赋值操作符的优先级低于不等操作符。
五、自增和自减操作符
1、在必要时才使用后置操作符
因为前置操作需要做的工作更少,只需要加1返回加1的结果显示,而后置操作符必须西安保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
2、在单个表达式中组合使用解引用和自增操作
vector<int>::iterator iter = ivec.begin();
while(iter != ivec.end())
cout<<*iter++<<endl;
*iter++怎么算???? 由于后自增操作优先于解引用操作,所以是*(iter++),自表达式iter++使iter
加1,然后返回iter原值的副本。
六、sizeof操作符
sizeof操作符的作用是返回一个对象或者类型名的长度。返回值的类型是size_t,sizeof表达式的结果是编译时常量、
七、优先级
一个表达式中,不要在两个或者更多的子表达式中对同一个对象做自增货自减操作
if(ia[index++] < ia[index]) //次表达式的行为就没有明确意义,在<操作符的左右都有index变量,但是这个先算左边还是右边这个是不定的,假的初始值index 为0就会出现两种状况:
if(ia[0] < ia[0]) // 右边的先
if(ia[0] < ia[1]) //左边先
该表达式最好这样写:
if(ia[index] < ia[index+1]){}
index++;
八、new和delete表达式
1、动态创建对象的初始化
int i(1024);
int *pi = new int (1024);
int s(10,'s');
int *ps = new string(10,'s');
如果提供了初值,new表达式分配到所需要的内存后,用给定的初值初始化该内存空间,如果不提供显示初始值,动态创建的对象与在函数内定义的变量初始化方式相同,对于类类型的对象,用该类的默认构造函数,内置类型的对象则无初始化。
2、撤销动态创建的对象
动态创建对象用完后,必须显示地将该对象占用的内存返回给自由存储区,delete表达式释放指针指向的地址空间。
如果指针指向不是new分配的内存地址,则在该指针上使用delete是不合法的。
3、悬垂指针
悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了!
一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不再指向任何对象。
4、const对象的动态分配和回收
动态创建const对象必须在创建时初始化,并且已经初始化就不能再修改。
const int *pci = new const int(1023) ;
5、动态内存的管理容易出错
- delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为“内存泄漏”
- 读写已删除的对象,如果删除指针所指向的对象后,将指针置为0值,比如容易检测
- 对同一内存空间使用两次delete表达式。当两个指针指向同一个动态创建的对象,删除就会发生错误。