练习4.21
int main()
{
vector<int> a = { 0,1,2,3,4,5,6,7,8,9 };
for (auto i : a)
{
cout << (i % 2 == 0 ? i : 2 * i) << " ";
}
}
练习4.22
int main()
{
int grade = 0;
cin >> grade;
string fg;
fg = (grade > 90) ? "high pass" : (grade > 75) ? "pass":(grade < 60)?"fail":"low pass";
cout << fg;
}
int main()
{
int grade = 0;
cin >> grade;
string fg;
if (grade > 90)
cout << "high pass";
else {
if (grade > 75)
cout << "pass";
else
{
if (grade < 60)
cout << "fail";
else
cout << "low pass";
}
}
}
我觉得条件运算符好理解一些,但是会要求表达式类型相同或可能转换为某个公共类型,所以更加束缚一些。
练习4.23
错误在于==两端的值,一个是字符串字面值,一个是字符字面值,无法比较,将右侧的字符更改成字符串即可。
int main()
{
string s = "word";
string p1 = s + s[s.size() - 1];
cout << p1 << endl; //wordd
string p2 =s + s[s.size() - 1] == "s" ? "" : "s";
//先加法,wordd
//再==, "wordd" = "s" ?
//再条件?:
//0?"":"s"
cout << p2 << endl; //"s"
}`
练习4.24
举例解释左结合律和右结合律:
关系运算符满足左结合律
if(i < j < k) //拿i<j的布尔值结果和k比较
if条件语句部分首先将i、j和第一个<运算符组合在一起,其返回的布尔值再作为第二个<运算符的左侧运算对象。也就是说,k比较的对象是第一次比较得到的那个或真或假的结果。
赋值运算满足右结合律
int ival, jval;
ival = jval = 0; //正确:都被赋值为0
靠右的赋值运算jval = 0作为靠左的赋值运算符的右侧运算对象。又因为赋值运算返回的是其左侧运算对象,所以靠右的赋值运算的结果(即jval)被赋给了ival。
下面此题左结合律的算法:
fg = ((grade > 90) ? "high pass" :(grade<60))?"fail":"pass";
"high pass"和grade<60不是同一类型,编译错误,但能运行。
运行时是上图中的代码
- 如果grade大于90
//实际上给fg赋值分为2步
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为真, 返回“high pass”
fg = "high pass" ? "fail" : "pass"; //非空字符串,条件为真,返回“fail”
- 如果grade小于等于90,大于等于60
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为假,返回 (grade < 60)
fg = (grade < 60) ? "fail" : "pass"; //条件为假,返回“pass”
- 如果grad小于60,输出fail
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为假,返回 (grade < 60)
fg = (grade < 60) ? "fail" : "pass"; //条件为真,返回“fail”