【C++基础】系列博客为参考《C++ Primer中文版(第5版)》(C++11标准)一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.成员访问运算符
点运算符和箭头运算符都可用于访问成员,其中,点运算符获取类对象的一个成员;箭头运算符与点运算符有关,表达式ptr->men
等价于(*ptr).men
:
1
2
3
4
string s1="a string",*p=&s1;
auto n=s1.size();
n=(*p).size();
n=p->size();
⚠️因为解引用运算符的优先级低于点运算符,所以执行解引用运算的子表达式两端必须加上括号。如果没有括号,代码的含义就大不相同了:
1
2
//运行p的size成员,然后解引用size的结果
*p.size();//错误:p本身是一个指针且不包含任何成员,它没有名为size的成员,
2.条件运算符
条件运算符(?:
)允许我们把简单的if-else
逻辑嵌入到单个表达式当中,条件运算符按照如下形式使用:
1
cond ? expr1 : expr2;
条件运算符的执行过程是:首先求cond的值,如果条件为真对expr1求值并返回该值,否则对expr2求值并返回该值。例如:
1
string finalgrade=(grade<60) ? "fail" : "pass";//条件运算符优先级高于赋值运算符
2.1.嵌套条件运算符
允许在条件运算符的内部嵌套另外一个条件运算符。例如:
1
finalgrade=(grade>90) ? "high pass" : (grade<60) ? "fail" : "pass";
条件运算符满足右结合律,意味着运算对象(一般)按照从右向左的顺序组合。因此在上面的代码中,靠右边的条件运算(比较成绩是否小于60)构成了靠左边的条件运算的:
分支。
2.2.在输出表达式中使用条件运算符
条件运算符的优先级非常低,因此当一条长表达式中嵌套了条件运算子表达式时,通常需要在它两端加上括号。一些例子:
1
2
3
cout<<((grade<60) ? "fail" : "pass");//输出pass或者fail
cout<<(grade<60) ? "fail" : "pass";//输出1或者0
cout<< grade < 60 ? "fail" : "pass";//错误:试图比较cout和60
第二条表达式等价于:
1
2
cout<<(grade<60);//输出1或者0
cout ? "fail" : "pass";//根据cout的值是true还是false产生对应的字面值
<<
运算符的返回值是cout。
第三条表达式等价于:
1
2
cout<<grade;//小于运算符的优先级低于移位运算符,所以先输出grade
cout < 60 ? "fail" : "pass";//然后比较cout和60