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,