c++primer学习笔记(5.0)表达式

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变成00变成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.11newdelete表达式

newdelete动态创建和释放数组,也可以动态创建和释放单个对象。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值