4.17
4.18
*++pbeg:先将pbeg加1,然后用加1后的pbeg作为解引用运算符的运算对象。
所以,会从vector的第二个元素开始输出,直至输出最后一个元素的后一个位置(未知)。
4.19
题目意思是:int ival, *ptr; vector<int> vec;
(a):判断ptr是否为空指针,若不是,再判断ptr指向的对象的值是否为0
(b):ival的值是否为0,若不是,再判断它加1后的值是否为0
(c):求值顺序不确定,没有意义的表达式,修改为“vec[ival] <= vec[ival+1]”
4.20
iter是vector<string>类型的迭代器,它指向的对象是string类型。
(a):合法,先加1,再解引用此时指向的string对象
(b):非法,string对象自加??
(c):非法,解引用运算符的优先级低于点运算符,而iter没有该成员函数
(d):合法,->运算符搭配迭代器使用,表示迭代器所指对象的成员
(e):非法,同(b)
(f ):合法,先判string对象是否为空,再将迭代器加1
4.21
#include#include #include #include #include #include using std::cin;using std::cout; using std::endl;using std::vector;using std::string;int main() { vector a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; for(auto &i : a) i = i%2 ? 2*i : i; return 0;}
4.22
#include#include #include #include #include #include using std::cin;using std::cout; using std::endl;using std::vector;using std::string;int main() { int grade = 70; string level = (grade > 90) ? "high pass" : (grade < 60) ? "fail" : (grade < 75) ? "low pass" : "pass"; cout << level << endl; return 0;}
4.23
条件运算符的优先级过低!!
修改为:string pl = s + (s[s.size() - 1] == 's' ? "" : "s");
4.24
左结合律:代入一个数试试,行不通。
4.25
先取反再左移6位,即10001110→1000000
但是程序运行结果是-7296,这是因为题目最后问的是“值”而不是字符了,所以应该由8位转向32位。
最后的结果为:1111 1111 1111 1111 1110 0011 1000 0000 值为:-7296
4.26
如果机器上int是32位,那就没有影响;如果机器上int是16位,则若设置第27位为1,那么该数的值仍为0。
4.27
(a):3
(b):7
(c):true
(d):true
4.28
cout << sizeof(int) << endl;
4.29
第一行输出:10,对数组使用时,返回的是数组的大小;对指针使用是,返回的是指针本身的大小
第二行输出:1,对指针解引用使用,返回的是指针所指数据的类型(p指向数组的第一个元素)的大小
4.31
本节的程序中使用前置版本或者后置版本的效果是一样的,但是后置版本还需要保留改变前的变量并进行返回,这是额外的无任何意义的操作,因此无需使用后置版本。这里前置版本和后置版本的效果是一样的,无需任何改写。
1 #include2 #include 3 4 using std::cout; 5 using std::endl; 6 using std::vector; 7 8 9 int main()10 {11 vector ivec(10,0);12 cout << "修改前ivec内元素值" << endl;13 for (auto a : ivec)14 cout << a << " ";15 cout << endl;16 17 vector ::size_type cnt = ivec.size();18 for (vector ::size_type ix = 0; ix != ivec.size(); ix++, cnt--)19 ivec[ix] = cnt;20 21 cout << "修改后ivec内元素值" << endl;22 for (auto a : ivec)23 cout << a << " ";24 cout << endl;25 26 return 0;27 }
4.32
利用指针和下标操作数组中的元素。
4.33
表达式实质为:(someVal ? ++x), (++y:x), (--y)
显然,编译器会报错,因为上面那个冒号没有定义。
4.34
(a):bool转换
(b):ival转换为float,计算完的结果转换为double
(c):cval转换为int,计算完毕后转换为double
4.35
(a):'a'转换为int,计算完后int转换为char
(b):ival转换为double,ui转换为double,计算完后double转换为float
(c):ui转换为float,计算完后float转换为double
(d):ival转换为float,计算完后float转换为double,最后计算完后double转换为char
4.36
i *= static_cast<int>(d);
4.37
int i; double d; const string *ps; char *pc; void *pv;
(a):pv = (void*)ps; // pv = static_cast<void*>(const_cast<string*>(ps));
(b):i = int(*pc); // i = static_cast<int>(*pc)
(c):pv = &d; // pv = static_cast<void*>(&d)
(d):pc = (char*)pv; // pc = static_cast<char*>(pv)
4.38
将 j/i 的结果转换为 double,然后赋给slope。