【C++基础】第二十五课:成员访问运算符和条件运算符

成员访问运算符,条件运算符

Posted by x-jeff on June 14, 2021

【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