4.1、105
4.2、(a).*vec.begin() == *(vec.begin()); (b) *vec.begin() + 1 == *(vec.begin()+1)
4.3、我觉得可以接受(个人看法并非标准答案,仅作参考);这种缺陷只会求值顺序对表达式的最后结果有影响的时候出现,而如果求值顺序如果对最后结果有影响那么避免这种缺陷本身就是编程人员的责任,编译器采用何种策略都是没有关系的
4.4、(((12/3)*4)+(5*15)) + ((24%4)/2) == 91;
//p4_4.cpp
#include <iostream>
using namespace std;
int main()
{
int a;
a = 12/3*4+5*15+24%4/2;
cout << "a = " << a << endl;
return 0;
}
4.5
a -86; b -18; c 0 d -2
4.6、 bool is_even = (inum%2 == 0) ? true:false;
4.7、表达式求值后得到的结果超出对应类型所能存储的最大值或最小值
4.8、逻辑与与逻辑或都是从左向右;与:当且仅当左面对象求值不能确定表达式的结果才对右边的表达式进行求值
相等性运算符对象的求值顺序是没有规定的
4.9、先判断cp是一个非空指针再判断指向的值分空
4.10 while(cin >> num != 42)
4.11 (a>b&&b>c&&c>d)
4.12 先比较j和k大小再用返回值与i比较是否相等
4.13
(a). d = 3.0; i = 3; (b).i = 3 , d = 3.5;
4.14
if( 42 = i) 报错
if(i = 42) 永远为真
4.15
pi 是指针: dval = ival = *pi = 0;
4.16
(a).赋值运算符优先级较低 if((p = getPtr()) != 0);
(b).检验是否相等应该是 == ; if(i == 1024);
4.17 前置递增运算符反会运算对象本身;后置递增运算符返回未递增之前对象的副本
4.18 会漏掉第一个输出而且会解引用尾后地址。
4.19
a 指针不为空,并且指针所指向的对象值不为0
b ival不为0 ival自增1也不为0(ival 既不等于-1也不等于0)
c 结果是未定义的,因为对象求值顺序是不确定的
vec[ival] <= vec[ival+1];
++ival;
4.20、
a)*iter++ 合法,先对iter自加1再对iter解引用
b)(*iter)++, 不合法,*iter是string类型,字符串没有自增运算
c)*iter.empty(),*iter是string类型,没有empty()成员
d)iter->empty() 合法
e)++*iter,不合法,
f) iter++->empty() ,合法,先检验iter是否为空再自增1;
4.21
//p4_21.cpp -- 使用条件运算符
#include <iostream>
#include <vector>
using namespace std;
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> ivec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto i = ivec.cbegin(); i != ivec.cend(); ++i)
cout << *i << " ";
cout << endl;
for (auto& c : ivec)
{
c = (c % 2 == 0) ? c : 2 * c;
}
{
vector<int> ivec = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto i = ivec.cbegin(); i != ivec.cend(); ++i)
cout << *i << " ";
cout << endl;
for (auto& c : ivec)
{
c = (c % 2 == 0) ? c : 2 * c;
}
for (auto i = ivec.cbegin(); i != ivec.cend(); ++i)
cout << *i << " ";
cout << endl;
cout << *i << " ";
cout << endl;
return 0;
}
}
4.22
finalgrade = (grade > 90) ? "high pass" : (grade > 75) ? "pass": (grade > 60) ? " low pass": "fail";
if(grade>90)
finalgrade = "high pass"
else if(grade > 75)
finalgrade = "pass"
else if(grade > 60)
finalgrade = "low pass"
else
finalgrade = "fail";
4.25
先按位取反,再左移6位
4.26
位置不够
4.27
3 7 true true
4.28
4.29
4.30
(sizeof x) + y; sizeof( p->mem[i]); (sizeof a) < b sizeof(f())
4.31
对本例来说,前置和后置都不影响的,得到的结果都是一样的
vector<int>::size_type cnt = ivec.size();
for(vector<int>::size_type ix = 0;
ix != ivec.size(); ix++,cnt--)
ivec[ix] = cnt;
4.32
遍历数组
4.33
如果someValue 为真则执行++x,++y;如果someValue 为假执行--x,--y;
4.34
a. if(fval) fval转换成bool值,非0为true;0 为false
b. dval = fval + ival; //ival转化为float类型与fval相加结果转换为double类型赋给dval;
c. dval + ival * cval //cval 提升为int类型和ival相乘结果转换为double 再与dval 相加
4.35
a.发生了:'a'提升为int类型与3相加再转化为char 类型赋值给cval
b 发生了: ival提升为float 与1.0相乘,ui转换为float类型再减去乘积
c 发生了: ui提升为float 乘积转换为double
d 发生了:ival提升为float 与fval相加和再提升为double 与dval相加结果再转换为char 类型
4.36
i *=static_cast<int>(d);
4.37
(a) pv = const_cast<void *>(ps);//
(b) i = static_cast<int>(*pc)
(c) pv = static_cast<void *>(&d);
(d) pc = static_cast<char *>(pv)
4.38
将j/i的结果强制转换成double 类型初始化slope;