练习4.1
105
练习4.2
(a) *(vec.begin())
(b) (*vec.begin()+1)
练习4.3
可以,不过这需要程序员对于编译器优化过程有更深入的了解。
练习4.4
12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;/*结果是91*/
12 / 3 * (4 + 5) * 15 + 24 % 4 / 2;/*结果是540*/
12 / 3 * (4 + 5) * (15 + 24) % 4 / 2;/*结果是0*/
练习4.5
(a) -86
(b) -378
(c) 0
(d) -2
练习4.6
int i ; cin >> i; if (i & 1) { cout << "奇数"; } else { cout << "偶数"; }
练习4.7
int i = INT_MAX + 1; int j = INT_MIN - 1; unsigned k = -1;
练习4.8
逻辑与运算符:左侧运算对象为真时才对右侧运算对象求值
逻辑或运算符:左侧运算对象为假时才对右侧运算对象求值
相等性运算符:从左到右
练习4.9
cp为指向字符串的字符指针,*cp为cp所指向字符串的值,若两者都不为空则正确
练习4.10
int i; while (cin >> i && i != 42);
练习4.11
int a = 10, b = 9, c = 8, d = 7; if (a > b && b > c && c > d);
练习4.12
i!=j<k 等价于i!=(j<k),先比较j是否小于k,然后再比较i是否不等于j<k小于运算符返回的布尔值
练习4.13
d=i=3.5 I=3 d=3.0
i=d=3.5 i=3 d=3.5
练习4.14
错误,字面值是右值
正确,if语句的条件部分把42赋给i,然后检查赋值的结果是否为真
练习4.15
不能把指针的值赋给int,而且局部变量pi如果未初始化也无法赋值
练习4.16
判断getPtr函数返回值与0,然后把计算出的布尔值返回给p,应改为if((p=getPtr()!=0)
if语句的条件部分把1024赋给i,然后检查赋值的结果是否为真
练习4.17
前置递增运算符把值加一后直接返回改变了的运算对象
后置递增运算符则需要将原始版本存储起来以便返回这个未修改的内容
练习4.18
将无法输出v.begin()的值,而且会输出尾后指针的内容
练习4.19
(a)判断ptr指针地址是否为null_ptr,若是则指针向前移动一个元素
(b)判断ival的值加1后返回的值和初始值是否都为真
(c)判断vector对应ival下标的元素是否小于等于对应ival+1下标的元素·
练习4.20
(a)合法,iter指向下一个元素,解引用iter的结果
(b)不合法,iter所指元素的值加1,但iter所指元素类型是string,无法执行递增
(c)不合法,iter是一个指针,没有empty成员
(d)合法,判断iter所指元素是否为空
(e)不合法,字符串无法自增
(f)合法,将iter指向下一个元素,并判断iter的初始值所指元素是否为空
练习4.21
for (auto iter = v.begin(); iter != v.end(); ++iter) { if ((*iter) & 1)*iter *= 2; }
练习4.22
int main() { int grade; while ((cin >> grade) && grade <= 100 && grade >= 0) { string finalgrade = (grade > 90) ? "high pass" : (grade > 75) ? "pass" : (grade >= 60) ? "low pass" : "fail"; cout << finalgrade << endl; } while ((cin >> grade) && grade <= 100 && grade >= 0) { string finalgrade; if (grade > 90)finalgrade = "high pass"; else if (grade > 75)finalgrade = "pass"; else if (grade >= 60)finalgrade = "low pass"; else finalgrade = "fail"; cout << finalgrade << endl; } }
练习4.23
条件运算符优先度低
string p1 = s + s[s.size() - 1] == 's' ? "" : "s"; 等比为 string p1 = (s + s[s.size() - 1] == 's') ? "" : "s";
应该改成string p1 = s + ((s[s.size() - 1] == 's') ? "" : "s");
练习4.24
条件运算符 条件 ? 表达式1 : 表达式2 ,先对条件判断,为真,对表达式1进行计算,为假,对表达式2进行计算,又有赋值运算符("=")是右结合的,所以如果条件运算符满足的是左结合则会有问题
练习4.25
Latin-1字符集是单字节8位,因此'q'<<6就等于01000000,查表可知为'@'
练习4.26
由于int只能保证最少有16位,因此在有的电脑上无法满足30个学生的要求
练习4.27
(a)3
(b)7
(c)true
(d)true
练习4.28
cout << "sizeof(char) = " << sizeof(char) << endl; cout << "sizeof(wchar_t) = " << sizeof(wchar_t) << endl; cout << "sizeof(char16_t) = " << sizeof(char16_t) << endl; cout << "sizeof(char32_t) = " << sizeof(char32_t) << endl; cout << "sizeof(short) = " << sizeof(short) << endl; cout << "sizeof(int) = " << sizeof(int) << endl; cout << "sizeof(long) = " << sizeof(long) << endl; cout << "sizeof(long long) = " << sizeof(long long) << endl; cout << "sizeof(float) = " << sizeof(float) << endl; cout << "sizeof(double) = " << sizeof(double) << endl; cout << "sizeof(long double) = " << sizeof(long double) << endl; cout << "sizeof(bool) = " << sizeof(bool) << endl; cout << "sizeof(string) = " << sizeof(string) << endl;
sizeof(char) = 1
sizeof(wchar_t) = 2
sizeof(char16_t) = 2
sizeof(char32_t) = 4
sizeof(short) = 2
sizeof(int) = 4
sizeof(long) = 4
sizeof(long long) = 8
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 8
sizeof(bool) = 1
sizeof(string) = 28
练习4.29
10 返回数组x的元素个数
32位环境为1,64位环境为2,因为指针长度在不同环境不同,64位环境为8字节,32位环境为4字节
练习4.30
(a)sizeof(x)+y
(b)sizeof(p->men[i])
(c)sizeof(a)<b
(d)sizeof(f())
练习4.31
前置递增运算符把值加一后直接返回改变了的运算对象
后置递增运算符则需要将原始版本存储起来以便返回这个未修改的内容
for (vector<int>::size_type ix = 0, cnt = ivec.size(); ix != ivec.size();) { ivec[ix++] = cnt--; }
练习4.32
ptr移动了ix(0到size-1)个位置
练习4.33
someValue是否为真,若为真x和y分别加一,若不为真,x和y分别减一
练习4.34
(a)float转化为bool
(b)ival转换成float,将fval+ival的结果转化为double
(c)cval转化为int,将ival*cval的结果转化为double
练习4.35
(a)cval = 'a' + 3; //'a'提升为int,然后'a'+3的结果给cval赋值的时候转化为char
(b)fval = ui - ival * 1.0; // ival转换为double, ui也转换为double。然后将double转换为float
(c)dval = ui * fval; // ui提升为float,然后这个float转换为double。
(d)cval = ival + fval + dval; // ival转换为float,得到ival和fval的和,然后ival和fval的和转换为double
// 最后,double被强制类型转换成char
练习4.36
i *= static_cast<int>(d);
练习4.37
(a)pv=static_cast<void*>(const_cast<string*>(ps))
(b)i=static_cast<int>(*pc);
(c)pv=static_cast<void*>(&d)
(d)pc=reinterpret_cast<char*>(pv)
练习4.38
j/i的int型的值被强制转化为double,并赋给了slope