继续记录我的C++ 学习之路,本文是第四章的练习题,第三章的链接在这里:
https://mp.csdn.net/mp_blog/creation/editor/124473013https://mp.csdn.net/mp_blog/creation/editor/124473013 4.1.2节练习
练习4.1
105
练习4.2
(a) *(vec.begin())
(b) (*vec.begin()) + 1
4.1.3节练习
练习4.3
可以接受,允许编译器采用任何求值顺序,使编译器在优化中可以根据需要调整实现表达式求值的指令序列,以得到效率更高的代码。
4.2节练习
练习4.4
91
练习4.5
(a) -86
(b) -18
(c) 0
(d) -2
练习4.6
int main()
{
int i = 4;
i % 2 == 0 ? cout << "even": cout << "odd";
}
练习4.7
溢出 :当计算的结果超出该类型所能表示的范围时就会产生
int main()
{
short i = 32767;
short j = i + 1;
short a = i + 2;
short b = i * 2;
}
4.3节练习
练习4.8
相等性运算符 > 逻辑与 > 逻辑或
练习4.9
cp为一个地址,不为0,所以继续执行逻辑与右侧部分,*cp为一个字符串,不为0,返回值为true。
练习4.10
int main()
{
int a = 0;
while(cin >> a && a != 42)
{ }
}
练习4.11
int main()
{
int a = 4, b = 2, c = 2, d = 1;
a > b && b > c && c > d ? cout << "true" : cout << "false";
}
练习4.12
执行顺序为: i != (j < k) ; 先比较 j 和 k 的大小关系,j < k则为真,将结果转化为 1 ,然后判断 i 是否不等于 1.
4.4节练习
练习4.13
(a) d = 3 ; i = 3
(b) d = 3.5 ; i = 3
练习4.14
if (42 = i)// 报错,表达式必须是可修改的左值
if (i = 42)// 42不为零,条件为真,执行 if 语句
练习4.15
不能将指针的值赋给int
dval = ival = *pi = 0;
练习4.16
(a)赋值运算符优先级较低,应该给需要赋值部分加上括号使其符合我们的原意。
(b)条件判断永远为真,若是想判断 i 和1024是否相等,应该用 “==”。
4.5节练习
练习4.17
前置递增/递减运算符首先将运算对象 ±1 ,然后将改变后的对象作为求值结果;后置版本也会将运算对象 ±1 ,但是求值结果是运算对象改变之前那个值的副本。
前置版本只储存改变后的值,后置版本既保存改变后的值也保存改变前的值。
练习4.18
无法输出第一个元素,而且若序列中没有负值,程序将可能试图引用一个根本不存在的元素。
练习4.19
(a)*ptr != 0 && *ptr++ // *ptr指向的指针不为0;
(b)判断 ival 和 ival + 1 的值是否都为零;
(c)该赋值语句是未定义的;vec[ival] <= vec[ival+1]
4.6节练习
(a)合法,首先对iter加1,再输出iter指向的值;
(b)不合法,iter指向的是字符串,字符串没有加法运算;
(c)不合法,iter是一个指针,它没有名为empty的成员;
(d)合法,检查iter指向的对象是否为空;
(e)不合法,*iter得到iter指向的字符串,字符串没有加法运算;
(f)合法,检查iter指向的对象是否为空,然后iter加1。
4.7节练习
练习4.21
int main()
{
vector vec{1,2,3,4,5,6,7,8,9};
for (auto& a : vec)
{
a % 2 == 1 ? a *= 2 : a = a;
cout << a << endl;
}
}
练习4.22
纯条件运算符
int main()
{
int grade;
cin >> grade;
(grade > 90) ? cout << "high pass" : (grade > 60 && grade < 75) ? cout << "low pass" : (grade < 60) ? cout << "fail" : cout << "pass";
}
+ if
int main()
{
int grade;
cin >> grade;
if (grade > 60)
{
grade > 90 ? cout << "high pass" : grade < 75 ? cout << "low pass" : cout << "pass";
}
else
cout << "fail";
}
练习4.23
?: 条件运算符优先级过低,导致该表达式的运算顺序为 字符串 s,加上s[3] 后的字符串与字符类型的 's' 进行比较,导致出错。改为:
string p1 = s + (s[s.size() - 1] == 's' ? " " : " s");
练习4.24
加入条件运算符满足的是左结合律,则表达式可写为:
finalgrade = ((grade > 90) ? "high pass" : (grade < 60))?"fail":"pass";
首先判断grade的值是否大于90,成立则为 high pass ,不然表达式为 grade < 60,编译无法通过,即使通过,也无法得到high pass、pass 和 fail 三种情况。



