5.1算术操作符
算术操作符优先级——一元操作符级别最高,其次是乘除操作,接着是二元的加减法操作。
求余操作和除法操作
注意一正一负的情况
-21%-8 //result is -5 close to 0
21%-5 //result is 1 or -4
-21/-8 //result is 2 close to 0
21/-5 //result is -4 or -5
5.2关系操作符和逻辑操作符
短路求值. 逻辑与,逻辑或总是先计算其左操作数,然后再计算其右操作数,只有仅仅靠左操作数的值无法确定该逻辑表达式的值时候,才会求解其右操作数。
习题5.8
#include<iostream>
#define TRUE 1
#define FAIL 0
using namespace std;
int main(){
int a,b,c,d;
cout<<"please input 4 intergers:"<<endl;
cin>>a>>b>>c>>d;
if(a>b&&b>c&&c>d){
cout<<"Good."<<endl;
return TRUE;
}
cout<<"bad."<<endl
return FAIL;
}
5.3位操作符
运 算 符 | 说 明 |
~ | 这是按位求反运算符。它是一个一元运算符,可以反转操作数中的位,即1变成0,0变成1 |
& | 这是按位与运算符,它对操作数中相应的位进行与运算。如果相应的位都是1,结果位就是1,否则就是0 |
^ | 这是按位异或运算符,它对操作数中相应的位进行异或运算。如果相应的位各不相同,例如一个位是1,另一个位是0,结果位就是1。如果相应的位相同,结果位就是0 |
| | 这是按位或运算符,它对操作数中相应的位进行或运算。如果两个对应的位中有一个是1,结果位就是1。如果两个位都是0,结果就是0 |
<< | 左移 |
>> | 右移 |
5.4赋值操作符
右结合性,低优先级
注意=与==的区别!!!!
赋值操作数必须是非const操作附的左值。
5.5自增自减操作符
只有在必要的时候才使用后置操作符!要养成使用前置操作符的好习惯~
5.6箭头操作符
(*p).foo;
p->foo; //这两个式子一样
习题5.18
#include<iostream>
#include<vector>
#include<string>
#define FAIL 0;
#define TRUE 1;
using namespace std;
int main(){
vector<string*> ivec;
string str;
cout<<"input some strings:"<<endl;
while(cin>>str){
string *pstr=new string;
*pstr=str;
ivec.push_back(pstr);
}
vector<string*>::iterator iter=ivec.begin();
while(iter!=ivec.end()){
cout<<**iter<<(**iter).size()<<endl;
iter++;
}
//释放各个动态分配的对象
iter=ivec.begin();
while(iter!=ivec.end()){
delete *iter;
iter++;
}
}
5.7条件操作符
c++中唯一的三元操作符
习题5.20
#include<iostream>
#define TRUE 1;
using namespace std;
int main(){
int val1,val2;
cout<<"input two intergers:"<<endl;
cin>>val1>>val2;
cout<<((val1>val2)?val2:val1); //严格使用括号把条件操作符括起来!!
cout<<(val1>val2)?val2:val1; //输出11或者0
return TRUE;
}
5.8sizeof操作符
sizeof操作符返回一个对象或类型名的长度,返回值的类型为size_t
example:
int sz=sizeof(ia)/sizeof(*ia); //返回的是数组ia的长度
返回内置类型的长度
#include<iostream>
#define FAIL 0;
#define TRUE 1;
using namespace std;
int main(){
int intlen=sizeof(int);
cout<<"int "<<intlen<<endl;
intlen=sizeof(double);
cout<<"double "<<intlen<<endl;
intlen=sizeof(long);
cout<<"long "<<intlen<<endl;
intlen=sizeof(short);
cout<<"short "<<intlen<<endl;
intlen=sizeof(string);
cout<<"string "<<intlen<<endl;
intlen=sizeof(float);
cout<<"float "<<intlen<<endl;
cout<<sizeof intlen<<endl<<sizeof (intlen) ;
return TRUE;
}
5.9逗号操作符
逗号表达式的结果是其右表达式。
5.10复合表达式求值
赋值操作右结合;算术操作左结合;注意优先级~!!!!!!!!!
使用圆括号可以避免初学时候搞错优先级别,分成两个独立语句。
一个表达式里,不要在两个或是更多的子表达式里对同一对象自增或者自减。
除了逻辑与与逻辑或外,c++没有定义其他二元操作符的求解次序,这是为了实现效率考虑,因为只有两个操作数涉及同一对象时,操作顺序才会影响计算结果。
5.11new和delete表达式
new和delete动态创建和释放数组,也可以动态创建和释放单个对象。
new表达式返回新创建对象的指针。
必须用直接初始化语法规则初始化动态创建的非内置类型对象
内置类型可以不初始化
如:
int i;
int *p=new int; //未初始化的对象
int *ip=new int(); //初始化为0
string *p=new string(10,9) //*p is 9999999999
总是初始化是一个好的实践。
int i;
int *p=new int;
delete p;
删除指针后,指针变成垂悬指针,很危险的说。一旦删除指针,立即把指针赋零!
5.12类型转换
算术转换
short,char----->int----->unsigned----->long-------->double
float----->double
指针转换
int ia[10];
int *p=ia; //ia数组转换为指向第一个元素的指针
bool转换
int cp=10;
if(cp) //cp转换为bool型,非零即1
强制类型转换(避免使用强制类型转换)
int a=3.14; //a=3
dynamic_cast
const_cast
static_cast
reinterpret_cast