运算符:
C 表达式中的左值和右值:当一个对象被用作左值时,用的是对象的身份(内存中的位置)。当作为右值时,用的是对象的值(内容)。或者说,lvalue:具有存贮性质的对象,通过它能够找到内存中存放的变量。rvalue:存放在lvalue对应内存中的东西。
int a,b;//a,b是持久的对象,是lvalue,而a b是临时对象,为rvalue。a 是右值, a是左值
int *p=&a;//p的左值是它指向的内存,或者说是a在内存中的地址,而右值是通过p找到的值就是a里的值
取模运算%:必须是两个整型类型参与运算,结果的符号决定于运算符左边元素的符号。
逻辑运算符:左侧运算对象是为了确保右侧运算对象求值过程的正确性和安全性----->利用短路求值策略
赋值运算符:如果赋值运算符左右两侧运算对象类型不同,右侧类型转换为左侧
string s1,s2;
s1=s2="ok";//字符串字面值转化为string类型
int i;
double d;
d=i=3.5;//d=3,i=3
i=d=3.6;//d=3.6,i=3遵从右向左赋值
递增递减运算符:除非必须,否则不用递增递减运算符的后置版本,避免做无用功还浪费内存。如果想要一条既能将变量加一又能使用原来的值的语句的时候可用后置。
ival &&ival---->没有必要,运算符两边都是自增前的值。
后自增操作的优先级高于解引用:
*iter --->*(iter ):iter 使得iter加一,然后返回iter的原值的副本作为该表达式的返回值
逗号运算符:按照从左到右依次执行,但是真正的值是最右侧的返回值,例如:
int a=12,b=11;
int c=0;
c=(a b,12);
cout<<c<
somevalue? x--,y--:x ,y 等价于 (somevalue ? x--,y--:x ),y ;//是个逗号运算符
语句
要注意变量的作用域!
if语句:if(......){} 语句里的判断条件要能转化成bool类型
switch语句:表达式里的返回值要能转化成整型与case标签相比较,case标签必须是整型常量表达式(包括字符,字符串)
switch内部的变量定义问题:因为switch里是根据case标签来执行语句的,因而存在部分语句被跳过而不执行的情况,如果这部分(被跳过)里存在对变量的定义,要执行的地方又使用了该变量,这种情况是非法的,编译器会报错,因而要限定变量的作用域哦!!!!
int a=3;
switch(a){
case 1:
int b=0;
a ;
// break;
case 3:
a=b;
break;//报错:跳过了变量b的初始化
}
try语句块和异常处理:
throw表达式,来段代码感受一下:
int a,b;
char ch;
cout<<"输入两个整型数字"<<endl;
while(cin>>a>>b){
try{
if(b==0)
throw runtime_error("除数为0");//抛出运行时错误
}catch(runtime_error err){//可以对应多个catch语句,对应于try里可能抛出的不同的错误处理,像上溢出,下溢出等。
cout<<err.what()<<endl<<"是否重写两个整数Y or N"<<endl;
cin>>ch;
if(ch=='N')
break;
}
cout<<"相除结果为:"< }
有一种情况是异常没有被捕捉到时,会调用标准库函数里的terminate终止当前程序执行
声明:
本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。