C++ Primer Answer ch04

自作多情 提交于 2020-02-28 03:18:02

4.1

#include <iostream>

using namespace std;

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

4.2

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec = {1, 3, 5};
    cout << *vec.begin() << ' ';
    cout << *(vec.begin()) << ' ';

    cout << *vec.begin() + 1 << ' ';
    cout << (*(vec.begin())) + 1;
    return 0;
}

4.3

可以。操作数的求解顺序通常对结果没什么影响,只有当二元操作符的两个操作数涉及同一对象,并改变对象的值时,操作数的求解顺序才会影响计算结果。实现效率的提高能使使用编译器的程序受益。

4.4

#include <iostream>

using namespace std;

int main()
{
    cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;//91
    return 0;
}

4.5

#include <iostream>

using namespace std;

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

4.6

a % 2 == 0;

4.7

溢出:计算的结果超出该类型所能表示的范围时就会产生溢出

#include <iostream>

using namespace std;

int main()
{
    short i1 = 32767;
    ++i1;
    cout << i1 << endl;

    short i2 = -32768;
    --i2;
    cout << i2 << endl;

    short i3 = 200 * 200;
    cout << i3 << endl;

    return 0;
}

4.8

按优先级从高到低:1)相等性2)逻辑与3)逻辑或

4.9

#include <iostream>

using namespace std;

int main()
{
    const char *cp = "Hello World";
    //cp不为空且cp指向的字符不为空字符
    if(cp && *cp)
        cout << 123;

    return 0;
}

4.10

#include <iostream>

using namespace std;

int main()
{
    int i;
    while(cin >> i && i != 42)
        cout << "Y" << endl;
    cout << "i = 42";

    return 0;
}

4.11

#include <iostream>

using namespace std;

int main()
{
    int a = 4;
    int b = 3;
    int c = 2;
    int d = 1;
    cout << (a > b && b > c && c > d);
    return 0;
}

4.12

#include <iostream>

using namespace std;

int main()
{
    int i, j, k;
    bool a1 = (i != j < k);
    bool a2 = (i != (j < k));
    if(a1 == a2)
        cout << "Y";

    return 0;
}

4.13

#include <iostream>

using namespace std;

int main()
{
    int i;
    double d;
    d = i = 3.5;
    cout << d << " " << i << endl;

    i = d = 3.5;
    cout << d << " " << i << endl;

    return 0;
}

4.14

#include <iostream>

using namespace std;

int main()
{
    int i;
    //false
    /*
    if(42 = i)
        cout << "a";
    */
    if(i = 42)
        cout << "b";
    return 0;
}

4.15

#include <iostream>

using namespace std;

int main()
{
    double dval;
    int ival;
    int *pi;
    //false,pi is a pointer//dval = ival = pi = 0;
    dval = ival = 0;
    pi = &ival;
    cout << dval << " " << ival << " " << pi;
    return 0;
}

4.16

#include <iostream>

using namespace std;

int main()
{
    //if(p = getPtr() != 0)

    //if((p = getPtr()) != 0)

    //if(i = 1024)

    //if(i == 1024)
    return 0;
}

4.17

前置运算符首先将运算对象加1(或减1),然后将改变后的对象作为求值结果。后置运算符将运算结果加1(或减1),

但求值结果是运算对象改变之前那个值的副本;

前置版本返回左值,后置版本返回右值;

4.18

与原来差一个位置,要修改pbeg != v.end()

4.19

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

int main()
{
    int i = 1;
    int *ptr = &i;
    vector<int> vec = {10, 20};
    int ival = -1;

    cout << (ptr != 0 && *ptr++);//短路求值,对
    cout << (ival++ && ival);//同上
    cout << (vec[ival++] <= vec[ival]);//未定义
    return 0;
}

4.20

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

int main()
{
    vector<string> a = {"123", "1"};
    vector<string>::iterator iter = a.begin();
    //cout << (*iter++);//123
    //false//cout << (*iter)++;
    //false//cout << *iter.empty();
    //cout << (iter->empty());//1
    //false//cout << (++*iter);
    cout << (iter++->empty());//0
    return 0;
}

4.21

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

int main()
{
    vector<int> a{1, 2, 3};
    for(auto &c : a)
    {
        (c % 2 == 1) ? c *= 2 : c;
    }
    for(auto c : a)
    {
        cout << c << endl;
    }
    return 0;
}

4.22

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

int main()
{
    int grade;
    string finalgrade;
    while(cin >> grade)
    {
        finalgrade = (grade > 90) ? "high pass" :
                                    (grade > 75) ? "pass" :
                                                   (grade > 60) ? "low pass" : "fail";
        cout << finalgrade << endl;
    }
    return 0;
}

4.23

#include <iostream>

using namespace std;

int main()
{
    string s = "word";
    //string p1 = s + s[s.size() - 1] == 's' ? "" : "s";
    string p1 = s + ((s[s.size() - 1] == 's') ? "" : "s");
    cout << p1;
    return 0;
}

4.24

从左往右结合

4.25

#include <iostream>

using namespace std;

int main()
{
    char i = 'q';
    cout << (~'q' << 6);
}

4.26

int可能为16位,16<27

4.27

#include <iostream>

using namespace std;

int main()
{
    unsigned long u11 = 3, u12 = 7;
    cout << (u11 & u12) << endl;//3
    cout << (u11 | u12) << endl;//7
    cout << (u11 && u12) << endl;//1
    cout << (u11 || u12) << endl;//1
    return 0;
}

4.28

#include <iostream>

using namespace std;

int main()
{
    cout << "bool:" << sizeof(bool) << endl;
    cout << "char:" << sizeof(char) << endl;
    cout << "signed char:" << sizeof(signed char) << endl;
    cout << "unsigned char:" << sizeof(unsigned char) << endl;
    cout << "short:" << sizeof(short) << endl;
    cout << "unsigned short:" << sizeof(unsigned short) << endl;
    cout << "int:" << sizeof(int) << endl;
    cout << "unsigned int:" << sizeof(unsigned int) << endl;
    cout << "long:" << sizeof(long) << endl;
    cout << "unsigned long:" << sizeof(unsigned long) << endl;
    cout << "float:" << sizeof(float) << endl;
    cout << "double:" << sizeof(double) << endl;
    cout << "long double:" << sizeof(long double) << endl;
    return 0;
}

4.29

#include <iostream>

using namespace std;

int main()
{
    int x[10];
    int *p = x;
    cout << sizeof(x) / sizeof(*x) << endl;
    cout << sizeof(p) / sizeof(*p) << endl;
    cout << sizeof(p) << endl;
    cout << sizeof(*p) << endl;
    return 0;
}

4.30

  (sizeof x) + y;
    sizeof (p->mem[i]);
    (sizeof a) < b;
    sizeof (f());

4.31

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

int main()
{
    vector<int> ivec(10);
    vector<int>::size_type cnt = ivec.size();
    //前置后置都可以,不影响
    for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix, cnt--)
        ivec[ix] = cnt;
    for(auto c : ivec)
        cout << c << endl;
    return 0;
}

4.32

#include <iostream>
#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 << " " << ia[ix];
        cout << endl;
    }
    return 0;
}

4.33

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

int main()
{
    int x = 1, y = 10;
    int someValue;
    /*someValue非0则加1;为0减1
    while(cin >> someValue)
    {
        cout << (someValue ? (++x, ++y) : (--x, --y)) << endl;
    }
    */
    while(cin >> someValue)
    {
        x = 1;
        y = 10;
        int a = (someValue ? ++x, ++y : --x, --y);
        cout << "x = " << x << " y = " << y << endl;
        x = 1;
        y = 10;
        int b = ((someValue ? (++x, ++y) : --x), --y);
        cout << "x = " << x << " y = " << y << endl;
        cout << "a = " << a << " b = " << b << endl;
        if(a == b)
            cout << "Y" << endl;
    }
    return 0;
}

4.34

#include <iostream>

using namespace std;

int main()
{
    float fval = 1.0;
    int ival = 1;
    double dval = 2.0;
    char cval = 'a';
    if(fval)//float->bool
        ;
    dval = fval + ival;//int->float,float->double
    dval + ival * cval;//char->int,int->double
    return 0;
}

4.35

#include <iostream>

using namespace std;

int main()
{
    char cval;
    int ival;
    unsigned int ui;
    float fval;
    double dval;

    cval = 'a' + 3;//char->int,int->char;
    fval = ui - ival * 1.0;//int->double,unsigned int->double,double->float
    dval = ui * fval;//unsigned int->float,float->double
    return 0;
}

4.36

#include <iostream>

using namespace std;

int main()
{
    int i = 2;
    double d = 3;
    cout << (i *= d) << endl;
    i = 2;
    cout << (i *= static_cast<double>(d));

    return 0;
}

4.37

#include <iostream>

using namespace std;

int main()
{
    int i;
    double d;
    const string *ps;
    char *pc;
    void *pv;
    //pv = (void*) ps;
    pv = static_cast<void*>(const_cast<string*>(ps));
    //i = int(*pc);
    i = static_cast<int>(*pc);
    //pv = &d;
    pv = static_cast<void*>(&d);
    //pc = (char*) pv;
    pc = static_cast<char*>(pv);

    return 0;
}

4.38

j/i转化为double类型给slope

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!