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
#include
using namespace std;
int main()
{
int a = 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;
cout << a << endl;
return 0;
}
4.5
(a) -86
(b) -18
(c) 0
(d) -2
4.6
string s = (n % 2 == 0)? "偶数" : "奇数";
4.7
溢出:当计算的结果超出该类型所能表示的范围。
4.8
相等性运算符 > 逻辑与 > 逻辑或
4.9
const char *cp = "Hello World";
if (cp && *cp)
先是解引用cp然后进行逻辑与,如果cp的值为ture,则不需要进行后面的判断。
4.10
#include
using namespace std;
int main()
{
int a = 0;
cin >> a;
while (a != 42)
cin >> a;
return 0;
}
4.11
a > b && b > c && c > d
4.12
i != j < k
首先判断j 是否小于k,是返回1,不是则返回0;然后判断i是否不等于返回的值。
4.13
(a)i = 3, d = 3.0
(b)d = 3.5, i = 3
4.14
if (42 = i)
if (i = 42)
4.15
duoble dval; int ival; int *pi;
dval = ival = pi = 0;
不能把指针的值赋给Int
修改:dval = ival = 0; pi = 0;
4.16
(a) if ((p = getPtr()) != 0)
(b) if (i == 1024)
4.17
前置递增运算符:首先将运算对象加1(或减1),然后将改变后的对象作为求值结果。
后置递增运算符:首先将运算对象加1(或减1),然后将改变前的对象作为求值结果。
4.18
如果使用前置运算符,不但无法输出第一个元素,而且更糟糕的是如果序列中没有负值,
程序将可能试图解引用一个根本不存在的元素。
4.19
(a)ptr != 0 && *ptr++
(b)ival++ && ival
(c)vec[ival++] <= vec[ival]
4.20
(a)迭代器iter加1,然后把原来迭代器iter指的值解引用
(b)解引用迭代器指的值iter,然后把迭代器iter加1
(c)错误,iter是迭代器,它没有名为empty的成员
(d)运行iter指代的对象的empty成员
(e)解引用迭代器iter所指对象,然后iter所指对象的值加1
(f)运行迭代器所指对象,然后迭代器加1
4.21
#include
#include
using namespace std;
int main()
{
vector<int> v = { 1, 2, 3, 4, 5, 6 };
for (auto it = v.begin(); it != v.end(); ++it)
{
cout << ((*it % 2 == 0) ? *it : (*it * 2));
cout << " ";
}
cout << endl;
return 0;
}
4.22
#include
using namespace std;
int main()
{
int grade = 0;
cout << "Enter a grade(0~100):" << endl;
cin >> grade;
string finalgrade;
cout << ((grade > 90) ? "high pass" : (grade > 75) ? "low pass" :
(grade > 60) ? "pass" : "fail");
cout << endl;
return 0;
}
#include
using namespace std;
int main()
{
unsigned grade = 0;
cout << "Enter a grade(0~100):" << endl;
cin >> grade;
if (grade > 90)
cout << "high pass";
else if (grade > 75)
cout << "low pass";
else if (grade > 60)
cout << "pass";
else
cout << "fail";
return 0;
}
4.23
string s = "word";
string s1 = s + s[s.size() - 1] == 's' ? "" : "s" ;
加法运算符优先级高于相等运算符
修改: string s1 = s + (s[s.size() - 1] == 's' ? "" : "s");
4.24
首先判断grade > 90,大于则为pass,不大于则为(grade > 60), 根据值选择其中一个作为后面的判断。
4.25
首先字符q的二进制会被扩展成32位,然后左移6位。则为7232
4.26
无法确保测试条件成立
4.27
(a)3
(b)7
(c)1
(d)1
4.28
#include
using namespace std;
int main()
{
char a = 's';
int i = 1;
double f = 3.14;
long q = 12;
float t = 2.5;
cout << sizeof(a) << " " << sizeof(i) << " " << sizeof(f)
<< " " << sizeof(q) << " " << sizeof(t) << endl;
return 0;
}
4.29
int x[10]; int *p = x;
cout << sizeof(x) / sizeof(*x) << endl;
cout << sizeof(p) / sizeof(*p) << endl;
4.30
(a)(sizeof x) + y
(b)sizeof (p->mem[i])
(c)(sizeof a) < b
(d)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
constexpr int size = 5;
int ia[size] = { 1, 2, 3, 4, 5 };
for (int *ptr = ia, ix = 0; ix != size && ptr != ia + size; ++ix, ++ptr)
遍历ia数组中的每个元素
4.33
someValue ? ++x, ++y : --x, --y;
判断someValue是否为0,是就递增x,y,不是就递减x,y
4.34
(a)float转化成bool
(b)int转化为float,然后float转化为double
(c)char转化为int,然后int转化为double
4.35
(a)int转化为char
(b)int转化为double,unsigned int 转为为double
(c)unsigned int 转化为float,float转化为double
(d)int转化为float,float转化为double,double转化为char
4.36
int 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 = static_cast<char*>pv;
4.38
把j / i 的值强制转化为double类型