《C++ Primer》5th 课后练习 第四章 表达式 21~30

练习4.21 编写一段程序,使用条件运算符从 vector 中找到哪些元素的值是奇数,然后将这些奇数值翻倍。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int temp{};
    vector<int> vec;
    while (cin >> temp)
    {
        vec.push_back(temp);
    }
    for (auto i : vec)
    {
        (i % 2) ? i *= 2 : i;
        cout << i <<endl;
    }
    return 0;
}

练习4.22 本节的示例程序将成绩划分为high pass、pass 和 fail 三种,扩展该程序使其进一步将 60 分到 75 分之间的成绩设定为 low pass。要求程序包含两个版本:一个版本只使用条件运算符;另一个版本使用1个或多个if语句。哪个版本的程序更容易理解呢?为什么?

#include<iostream>
using namespace std;
int main()
{
    int temp{};
    while (cin >> temp)
    {
        cout << ((temp > 90) ? "hign pass"
            : (temp > 75) ? "pass" 
            : (temp > 60) ? "low pass" : "fail") << endl;
    }
    return 0;
}
#include<iostream>
using namespace std;
int main()
{
    int temp{};
    while (cin >> temp)
    {
        if (temp > 90)
            cout << "high pass";
        else if (temp > 75)
            cout << "pass";
        else if (temp > 60)
            cout << "low pass";
        else
            cout << "fail";
        cout << endl;
    }
    return 0;
}

练习4.23 因为运算符的优先级问题,下面这条表达式无法通过编译。根据4.12节中的表指出它的问题在哪里?应该如何修改?

string s = "word";
string pl = s + s[s.size() - 1] == 's' ? "" : "s" ;

加法运算符的优先级高于条件运算符。因此要改为:

string pl = s + (s[s.size() - 1] == 's' ? "" : "s") ;

练习4.24 本节的示例程序将成绩划分为 high pass、pass、和fail三种,它的依据是条件运算符满足右结合律。假如条件运算符满足的是左结合律,求值的过程将是怎样的?

finalgrade = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass";
finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";//左结合

有可能会将"high pass"作为下一个条件表达式的判断条件,进而引发错误。

练习4.25 如果一台机器上 int 占 32 位、char 占8位,用的是 Latin-1 字符集,其中字符’q’ 的二进制形式是 01110001,那么表达式~‘q’ << 6的值是什么?

首先提升至int 得到 00000000 00000000 00000000 01110001,

最终结果为00000000 00000000 00100011 10000000

练习4.26 在本节关于测验成绩的例子中,如果使用unsigned int作为quiz1 的类型会发生什么情况?

应该不会发生异常吧。

由于在部分机器上unsigned int 只占两字节,所以如果用unsigned int作为quiz1的类型,可能会在部分机器上发生数据丢失等状况。

练习4.27 下列表达式的结果是什么?

unsigned long ul1 = 3, ul2 = 7;
(a) ul1 & ul2 
(b) ul1 | ul2 
(c) ul1 && ul2
(d) ul1 || ul2 

a 3

b 7

c true

d true

练习4.28 编写一段程序,输出每一种内置类型所占空间的大小

#include<vector>
#include<iostream>
using namespace std;
int main()
{
	cout << "bool_size: " << sizeof(bool) << endl;//1
	cout << "char_size: " << sizeof(char) << endl;//1
	cout << "short_size: " << sizeof(short) << endl;//2
	cout << "int_size: " << sizeof(int) << endl;//4
	cout << "long_size: " << sizeof(long) << endl;//4
	cout << "long long_size: " << sizeof(long long) << endl;//8
	cout << "float_size: " << sizeof(float) << endl;//4
	cout << "double_size: " << sizeof(double) << endl;//8
	cout << "long double_size: " << sizeof(long double) << endl;//8
	return 0;
}

练习4.29 推断下面代码的输出结果并说明理由。实际运行这段程序,结果和你想象的一样吗?如果不一样,为什么?

int x[10]; int *p = x;
cout << sizeof(x)/sizeof(*x) << endl;//10
cout << sizeof(p)/sizeof(*p) << endl;//1

与我想象的一样,第一个sizeof求得数组得总大小10*4,第二个sizeof求得得数组元素的大小4,两者相除结果为10;第三个sizeof求得指针p的大小4,第四个sizeof求得指针p指向元素的大小4

练习4.30 根据4.1.2节中的表,在下述表达式的适当位置加上括号,使得加上括号之后的表达式的含义与之前表达式的含义相同。

sizeof x+y			sizeof p->men[i]
sizeof a<b			sizeof f()
(sizeof x)+y			sizeof (p->men[i])
(sizeof a)<b			sizeof (f())
发布了276 篇原创文章 · 获赞 21 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_40758751/article/details/103986922