C++ Primer 答案(一)

第一章

1.6
去掉前两个 ;

1.8
一个/* 对应一个 */
std::cout << /* "*/" */;
相当于
std::cout << " */;
因此少了一个 "

第二章

2.9
(b)错误, {}进行列表初始化存在丢失数据风险时会报错

2.10
默认初始化:
1、定义在任何函数体外的变量会被初始化为0。   
2、定义在函数体内部的变量不会被初始化。 
3、类的对象未被初始化,则初值由类决定。
所以 第一个变量是一个空字符串,第二个变量是0,第三个变量不确定, 第四个变量是空字符串

2.11
声明:只确定变量的名字和类型。 定义:还会申请存储空间,可能会赋予初始值。
声明一个变量而不想定义它,那么可以在变量名前加extern关键字。但是如果后面接着赋值的话,就不再是声明而是定义
所以 1、定义   2、定义  3、声明

2.12
变量名: 字母+数字+下划线(必须以字母或者下划线开头)(不能用内置的)
所以 a,c,d 错误,b,e 正确

2.14
合法
第二个 i 是局部变量,作用域只是for循环内
所以输出是 100 45

2.15
引用即别名,引用时类型必须正确,且必须初始化
所以 b,d 错误,a,c 正确

2.17
输出 10 10

2.20 
把 i 变成 42*42

2.22
第一个判断的是:P指针是否为空指针
第二个判断的是:P指针所指向的对象是否为0

2.25
int *p1, p2;
我以后都采用这种写法

第三章

3.2
读取一行:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    while (getline(cin , s))
    {
        cout<<s<<endl;
    }
    return 0;
}


读取一个单词:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    while (cin>>s)
    {
        cout<<s<<endl;
    }
    return 0;
}

3.3
对于string类的输入运算符,它会自动忽略开头的空白(空格、制表符、换行等等),从第一个真正的字符开始直到下一个空白。
对于getline()函数,它会保存字符串中的空白符,它读入数据,直到遇到换行符位置。

3.6

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "asdfdsfdsf";
    for(char &c : s)  //不要忘了&
    {
        c = 'x';
    }
    cout << s << endl;
    return 0;
}

3.9
不合法,s 是空串

3.10

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s = "as?d@fd!s,,,,d,sf";
    for(auto c : s)
    {
        if(!ispunct(c))
            cout << c;
    }
    cout <<endl;
    return 0;
}

3.11
合法,是const char&

3.23

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v = {1,2,3,4,5,6,7,8,9,10};
    for(auto iter = v.begin(); iter !=v.end(); iter++)
        *iter *= 2;
    for(auto iter = v.cbegin(); iter !=v.cend(); iter++)
        cout << *iter <<endl;
    return 0;
}

第五章

5.13
(a):缺少break;
(b):ix应在外部声明定义
(c):改为case 1 : case 2: case : 3....
(d):case 后面需要加的是常量表达式,可以加const修饰符,将ival、jval、kval变成”常量“

5.25

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    double x, y;
    cout << "Enter your numbers " <<endl;
    while(cin >> x >> y)
    {
        try
        {
            if(y == 0)
                throw runtime_error("The denominator cannot be 0");
            cout << "x/y is " << x/y <<endl;
            break;
        }
        catch (runtime_error err)
        {
            cout << err.what()
                 << "\nTry again? Enter y or n" << endl;
            char c;
            cin >> c;
            if(c == 'n' || !cin)
                break;
            cout << "Enter your numbers " <<endl;
        }
    }
}

第六章

6.16

bool is_empty(const string &s){return s.empty()}

6.16
(a) bool compare(const matrix &m1, const matrix &m2) {}
(b) vector<int>::iterator change_var(const int &i, vector<int>::iterator iter){}

6.25

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
    for(int i = 0; i != argc; i++)
    {
        cout << argv[i] <<endl; //试试看,没按题目要求来
    }
    return 0;
}

6.27

#include <iostream>
#include <vector>
using namespace std;

int sum(initializer_list<int> il)
{
    int sum =0;
    for(const auto &elem : il)
        sum += elem;
    return sum;
}
int main(int argc, char *argv[])
{
    cout << sum({12,435,43,4543}) <<endl;
    return 0;
}

6.40
(a)合法
(b)不合法,默认实参应放在后面

6.44

inline bool isShoter(const string &s1, const string &s2)
{
    return s1.size() < s2.size();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值