4.22:本节的示例程序将成绩划分为high pass、pass和fail三种,扩展该程序使其进一步将60分到75分之间的成绩设定为low pass。要求程序包含两个版本:一个版本只使用条件运算符:另外一个版本使用1个或多个if语句。哪个版本的程序更容易理解呢?为什么?
Ans:由于将需要将分数划分为不同的4个等级,所以如果使用条件运算符,那么至少要嵌套3层条件运算符,并且使用条件运算符编写程序时相对方便,但是若嵌套过多可读性差,不容易理解。
若使用if语句则需要判断4个条件,分别输出各个成绩的所在的等级,编写起来相对繁琐,但是可读性相对较好,便于理解。
4.23:因为运算符的优先级问题。下面这条表达式无法通过编译。根据4.12节中的表(第147页)指出它的问题在哪里?应该如何修改?
string s = "world";
string p1=s + s [ s.size()-1]==' s ' ? " " : " s ";
Ans:由于条件运算符的优先级极低,并且根据其他运算符的优先级顺序,所以整个表达式的执行顺序是:赋值运算符的右边首先是先执行加法运算符,也就是将对象s与s[s.size()-1]相加后得到一个新的字符串,然后将新字符串与' s '进行比较,这里已经出现了非法操作,然后才去执行条件运算符。不仅与表达式的预期不一样,并且编译器无法通过。应修改为:string p1=s + ((s [ s.size()-1]==' s ' )? " " : " s ");
4.24:本节的示例程序将成绩划分成high pass、pass和fail三种,它的依据是条件运算符满足右结合律。假如条件运算符满足的是左结合律,求值过程是怎样的?
Ans:原表达式为finalgrade=(grade > 90)? "high pass " : (grade<60) ? " fail ": (grade<60)? " fail " : " pass "; 若让其满足左结合律,那么也就是等价于:finalgrade= ( (grade > 90)? "high pass " : (grade<60) ) ? " fail ": (grade<60)? " fail " : " pass ";
那么其求值过程应该是:若grade<90,那么执行表达式2也就是grade<60,它返回的值是一个布尔类型,若是真,则为1,若grade>90,那么执行表达式1也就是“ high pass ",返回一个字符串,然后两者返回的结果类型不相同,不合语法。并且就算语法通过,第一个条件表达式得到的结果有三个值,分别为" high pass "、0、1,但是结果只有两个fail和pass,与所预期的不一样。