天天看点

C++ Primer(第五版) 第四章练习答案C++ Primer(第五版) 第四章练习答案

C++ Primer(第五版) 第四章练习答案

目录

  • C++ Primer(第五版) 第四章练习答案
      • 4.1
      • 4.2
      • 4.3
      • 4.4
      • 4.5
      • 4.6
      • 4.7
      • 4.8
      • 4.9
      • 4.10
      • 4.11
      • 4.12
      • 4.13
      • 4.14
      • 4.15
      • 4.16
      • 4.17
      • 4.18
      • 4.19
      • 4.20
      • 4.21
      • 4.22
      • 4.23
      • 4.24
      • 4.25
      • 4.26
      • 4.27
      • 4.28
      • 4.29
      • 4.30
      • 4.31
      • 4.32
      • 4.33
      • 4.34
      • 4.35
      • 4.36
      • 4.37
      • 4.38

4.1

#include <iostream>

using namespace std;

int main()
{
    // 105
    cout << (5 + ((10 * 20) / 2)) << endl;

    return 0;
}
           

4.2

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{4, 3, 2, 1};

    cout << (*(vec.begin())) << " "
         << ((*(vec.begin())) + 1) << endl;

    return 0;
}
           

4.3

/**
 * 可以 有 ()
 */
           

4.4

#include <iostream>

using namespace std;

int main()
{
    cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 << endl;

    cout << ((((12 / 3) * 4) + (5 * 15)) + ((24 % 4) / 2)) << endl;

    return 0;
}
           

4.5

#include <iostream>

using namespace std;

int main()
{
    // -86
    cout << -30 * 3 + 21 / 5 << endl;
    // -18
    cout << -30 + 3 * 21 / 5 << endl;
    // 0
    cout << 30 / 3 * 21 % 5  << endl;
    // -2
    cout << -30 / 3 * 21 % 4 << endl;

    return 0;
}
           

4.6

#include <iostream>

using namespace std;

int main()
{
    int i = 1;

    if (i % 2 == 0)
        cout << "偶数" << endl;
    else
        cout << "奇数" << endl;

    return 0;
}
           

4.7

#include <iostream>
#include <limits.h>

using namespace std;

int main()
{

    cout << INT_MAX + 1 << endl;

    cout << UINT_MAX + 2 << endl;

    cout << LONG_LONG_MAX + 1 << endl;

    return 0;
}
           

4.8

/**
 * 从左到右
 */
           

4.9

#include <iostream>

int main()
{
    const char *cp = "\0Hello World";

    // 指针不为空 && 不是空字符
    if (cp && *cp)
        puts(cp);
    else
        puts(cp + 2);

    return 0;
}
           

4.10

#include <iostream>

int main()
{
    int i;
    while (std::cin >> i && i != 42)
        std::cout << i << '\n';

    return 0;
}
           

4.11

#include <iostream>

int main()
{
    int a = 4, b = 3,c = 2, d = 1;

    bool bl = a > b && b > c && c > d;

    std::cout << std::boolalpha << bl << std::noboolalpha << std::endl;

    return 0;
}
           

4.12

#include <iostream>

int main()
{
    int i = 2, j = 20, k = 30;

    // i != 1 为 true  赋值运算符 低于 关系运算符
    bool bl = i != j < k;

    std::cout << std::boolalpha << bl << std::noboolalpha << std::endl;

    return 0;
}
           

4.13

#include <iostream>

int main()
{
    int i; double d;
    d = i = 3.5; 
    // 3 3.00
    printf("%d %.2lf\n", i, d);
    i = d = 3.5; 
    // 3 3.50
    printf("%d %.2lf\n", i, d);

    return 0;
}
           

4.14

#include <iostream>

int main()
{
    int i = 10;

    // 不是左值
    if (42 = i) ;
    // 返回 42 为 true
    if (i = 42) ;

    return 0;
}
           

4.15

#include <iostream>

using namespace std;

int main()
{
    double dval;
    int ival;
    int *pi;

    // int * 赋值给 int
    // dval = ival = pi = 0;
    dval = ival = 0;
    pi = nullptr;

    return 0;
}
           

4.16

#include <iostream>

using namespace std;

int main()
{
    if ((p = getPtr()) != 0) ;
    if (1 == 1024) ;

    return 0;
}
           

4.17

/**
 * 前置递增  返回改变后的值
 * 后置递增  返回改变前的值
 */
           

4.18

/**
 * 没有第一个值
 * 解引用未定义值
 */
           

4.19

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *ptr;
    vector<int> vec{1, 2, 3 ,4};
    int ival = -1;

    // 指针不为空 && 不为空字符
    // ptr != 0 && *ptr++

    // ival != 0, ++iavl && ival != 0
    if (ival++ && ival)
        cout << ival << endl;
    
    // 一直为真
    while (vec[ival++] <= vec[ival])
        cout << vec[ival] << endl;

    return 0;
}
           

4.20

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> svec{"xi", "ao", "lg", "sn"};

    vector<string>::iterator iter = svec.begin();

    // 解引用后指针指向下一位
    *iter++;
    // 不合法  string没有++运算符
    (*iter)++:
    // 不合法  指针本身没有成员
    *iter.empty();
    // 第一个string是否为空
    iter->empty();
    // 不合法  string没有++运算符
    ++*iter;
    // 第一个string是否为空, 指针指向下一个
    iter++->empty();

    return 0;
}
           

4.21

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<int> vec{1, 2, 3, 4, 5, 6, 7};

    for (auto &i : vec)
        i =  i % 2 == 0 ? i : i * 2;
        
    return 0;
}
           

4.22

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    int i;

    while (cin >> i && i <= 100 && i >= 0)
        if (i >= 90)
            cout << "high pass" << endl;
        else if (i >= 60 && i <= 75)
            cout << "low pass" << endl;
        else if (i >= 60)
            cout << "pass" << endl;
        else
            cout << "fail" << endl;

    while (cin >> i && i <= 100 && i >= 0)
        cout << (i >= 90 ? "high pass" : 
                 i >= 60 && i <= 75 ? "low pass" :
                 i >= 60 ? "pass" : "fail") << endl;
    

    return 0;
}
           

4.23

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    string s("word");
    // 算术运算符 比 关系运算符高
    string p1 = s + (s[s.size() - 1] == 's' ? "" : "s");

    cout << p1 << endl;

    return 0;
}
           

4.24

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    int i = 0;
    // 左结合
    cout << ( (i > 0) ? "i > 0" : i < 0 ? "i < 0" : "i == 0" ) << endl;

    return 0;
}
           

4.25

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    char ch = 'q';
    // 提升为 int 32 位
    // 1110001000000
    // 4096 + 2028 + 1024 + 64 = 7232
    cout << (ch << 6) << endl;

    return 0;
}
           

4.26

#include <iostream>

using namespace std;

int main()
{
    unsigned int quizl = 0;
    // 27位 为 1
    quizl |= 1U << 31;
    // 0100
    // 1011
    // 0000
    // quizl &= ~(1U << 27);

    bool status = quizl & (1u << 31);

    cout << boolalpha << status << noboolalpha << endl;

    return 0;
}
           

4.27

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    unsigned long ul1 = 3, ul2 = 7;
    // 00011
    // 00111 &    |
    // 0011 = 3   7
    ul1 & ul2
    ul1 | ul2
    // true
    ul1 && ul2
    // true
    ul1 || ul2

    return 0;
}
           

4.28

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    printf("sizeof(bool) = %zd\n", sizeof(bool));
    printf("sizeof(char) = %zd\n", sizeof(char));
    printf("sizeof(short) = %zd\n", sizeof(short));
    printf("sizeof(int) = %zd\n", sizeof(int));
    printf("sizeof(long) = %zd\n", sizeof(long));
    printf("sizeof(float) = %zd\n", sizeof(float));
    printf("sizeof(double) = %zd\n", sizeof(double));
    printf("sizeof(int*) = %zd\n", sizeof(int*));
    printf("sizeof(long double) = %zd\n", sizeof(long double));

    return 0;
}
           

4.29

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int x[10];
    int *p = x;

    // 10
    cout << sizeof(x) / sizeof(*x) << endl;    
    // 2  指针8字节
    cout << sizeof(p) / sizeof(*p) << endl;

    return 0;
}
           

4.30

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    (sizeof x) + y    

    sizeof (p->mem[i])

    (sizeof a) < b

    sizeof (f())

    return 0;
}
           

4.31

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    /**
     * 不用后置版本 不用存储原值    
     */
    vector<int> ivec(4);

    vector<int>::size_type cnt = ivec.size();

    for (vector<int>::size_type ix = 0; ix != ivec.size(); ix++, cnt--)
        ivec[ix] = cnt;
    
    return 0;
}
           

4.32

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    constexpr int size = 5;
    int ia[size] = {1, 2, 3, 4, 5};
    for (int *ptr = ia, ix = 0; ix != size && ptr != ia + size; ++ix, ++ptr)
        cout << *ptr << " ";
    cout << endl;

    return 0;
}
           

4.33

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    bool someValue = true;
    int x = 10, y = 100;

    int a = (someValue ? --x, --y : ++x, ++y);

    cout << a << endl;
    cout << x << " " << y << endl;

    return 0;
}
           

4.34

/**
 * bool
 * double float
 * double int
 */
           

4.35

/**
 * char int
 * float double double
 * double float
 * char float double
 */
           

4.36

/**
 * i *= static_cast<int>(d);
 */
           

4.37

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int i;  double d;   const string *ps;   char *pc;   void *pv;

    pv = static_cast<void*>(const_cast<string*>(ps));
    
    i = static_cast<int>(*pc);

    pv = static_cast<void*>(&d);

    pc = static_cast<char*>(pv);

    return 0;
}
           

4.38

/**
 * j / i 的结果强制转换为 double 赋值给 slope
 * double slope = static_cast<double>(j / i);
 */
           

继续阅读