c++primer练习4.6-4.12

4.20

vector<string>::iterator iter;
*iter++;
(*iter)++;
*iter.empty();
iter->empty()
++*iter;
iter++->empty();

 

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

int main()
{
    vector<string> i = {"0","1","2","3"};
    vector<string>::iterator iter;
    for(iter = i.begin(); iter != i.end(); )
    {
        cout << *iter++ <<endl;
    }

}

表达式合理,输出0 1 2 3,表达式的含义是取迭代器指向的参数的值,迭代器向后移一位.

  • (a)合法。返回迭代器所指向的元素,然后迭代器递增。
  • (b)不合法。因为vector元素类型是string,没有++操作。
  • (c)不合法。这里应该加括号,变为(*iter).empty()。
  • (d)合法。判断迭代器当前的元素是否为空。
  • (e)不合法。string类型没有++操作。
  • (f)合法。判断迭代器当前元素是否为空,然后迭代器递增。

4.21.

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

int main()
{
    vector<int> shuZu = {0,1,2,3,4,5,6,7,8,9,10};
    vector<int>::iterator iter;
    for(iter = shuZu.begin(); iter != shuZu.end(); iter++)
    {
        if((*iter)%2 == 1)
        {
            *iter = 2*(*iter);
        }
        cout << *iter << endl;
    }
}

4.22

(1)

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

int main()
{
    int grade;
    string finalgrade;
    cin >> grade;
    finalgrade = (grade >= 90 ) ? "high pass" :(grade >= 75) ? "pass" :(grade >= 60) ? "low pass" :"failed";
    cout << finalgrade << endl;
    system("pause");
}

(2)

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

int main()
{
    int grade;
    string finalgrade;
    cin >> grade;
    if(grade >= 90)
    {
        finalgrade = "high pass";
    }

    if(grade >= 75 && grade < 90)
    {
        finalgrade = "pass";
    }

    if(grade >= 60 && grade < 75)
    {
        finalgrade = "low pass";
    }

    if(grade < 60)
    {
        finalgrade = "fail";
    }

    cout << finalgrade << endl;

    system("pause");
}

4.23 由于这一条表达式中 == 的优先级高于 = ,所以会先做 == ,就会造成把bool型赋给string的错误,+运算时这条表达式中优先级最高的所以改为 

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

4.24

如果条件运算符满足的是左结合律。那么

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

等同于 

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

假如此时 grade > 90 ,第一个条件表达式的结果是 "high pass" ,而字符串字面值的类型是 const char *,非空所以为真。因此第二个条件表达式的结果是 "fail"。这样就出现了自相矛盾的逻辑。

4.25.由于位运算符作用于整数类型的运算对象,并把运算对象看成是二进制位的集合。所以对于‘q’ 为 01110001,做~'q' << 6,过程是先将char类型提升为int型,即00000000 00000000 00000000 01110001,取反为 11111111 11111111 11111111 10001110,再向左移6位,得到11111111 11111111 11100011 10000000,结果是-7296。

4.16 对于有些机器来说,unsiged int 是16位,所以结果可能是未定义的。

4.27 分别是做位与、位或、与、或运算。

4.28

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    cout <<  "int    :" << sizeof(int) << endl;
    cout <<  "char   :" << sizeof(char) << endl;
    cout <<  "float  :" << sizeof(float) << endl;
    cout <<  "bool   :" << sizeof(bool) << endl;
    cout <<  "short  :" << sizeof(short) << endl;
    cout <<  "long   :" << sizeof(long) << endl;
    cout <<  "long long    :" << sizeof(long long) << endl;
    cout <<  "double       :" << sizeof(double) << endl;
    cout <<  "long double  :" << sizeof(long double) << endl;

    return 0;
}

 4.29

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

结果是10, 1,sizeof 作用于数组时计算的是整个数组的大小,*x是指向数组第一个数的指针。相当于40/4      4/4

4.30

(a)sizeof (x +y)

(b)sizeof (p->men[i])

(c)(sizeof a) < b

(d)sizeof (f())

4.31 一般情况下使用前置递增或者递减,除非必须不使用后置递增递减。在这个程序中使用前置递增和递减无影响。所以只需把前置改成后置就行。

4.32 这个循环的含义是遍历ia数组。

4.33 在这个表达式中逗号表达式的优先级最低,所以表达式相当于, (someValue ? ++x, ++y : --x), --y,执行过程是先对someValue判断真假,若为真,执行++x,++y执行完以后执行--y,若为假则执行--x,再执行--y,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值