C++ Primer(第五版) 第四章练习答案
目录
- C++ Primer(第五版) 第四章练习答案
-
-
- 4.1
- 4.2
- 4.3
- 4.4
- 4.5
- 4.6
- 4.7
- 4.8
- 4.9
- 4.10
- 4.11
- 4.12
- 4.13
- 4.14
- 4.15
- 4.16
- 4.17
- 4.18
- 4.19
- 4.20
- 4.21
- 4.22
- 4.23
- 4.24
- 4.25
- 4.26
- 4.27
- 4.28
- 4.29
- 4.30
- 4.31
- 4.32
- 4.33
- 4.34
- 4.35
- 4.36
- 4.37
- 4.38
4.1
#include <iostream>
using namespace std;
int main()
{
// 105
cout << (5 + ((10 * 20) / 2)) << endl;
return 0;
}
4.2
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec{4, 3, 2, 1};
cout << (*(vec.begin())) << " "
<< ((*(vec.begin())) + 1) << endl;
return 0;
}
4.3
/**
* 可以 有 ()
*/
4.4
#include <iostream>
using namespace std;
int main()
{
cout << 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2 << endl;
cout << ((((12 / 3) * 4) + (5 * 15)) + ((24 % 4) / 2)) << endl;
return 0;
}
4.5
#include <iostream>
using namespace std;
int main()
{
// -86
cout << -30 * 3 + 21 / 5 << endl;
// -18
cout << -30 + 3 * 21 / 5 << endl;
// 0
cout << 30 / 3 * 21 % 5 << endl;
// -2
cout << -30 / 3 * 21 % 4 << endl;
return 0;
}
4.6
#include <iostream>
using namespace std;
int main()
{
int i = 1;
if (i % 2 == 0)
cout << "偶数" << endl;
else
cout << "奇数" << endl;
return 0;
}
4.7
#include <iostream>
#include <limits.h>
using namespace std;
int main()
{
cout << INT_MAX + 1 << endl;
cout << UINT_MAX + 2 << endl;
cout << LONG_LONG_MAX + 1 << endl;
return 0;
}
4.8
/**
* 从左到右
*/
4.9
#include <iostream>
int main()
{
const char *cp = "\0Hello World";
// 指针不为空 && 不是空字符
if (cp && *cp)
puts(cp);
else
puts(cp + 2);
return 0;
}
4.10
#include <iostream>
int main()
{
int i;
while (std::cin >> i && i != 42)
std::cout << i << '\n';
return 0;
}
4.11
#include <iostream>
int main()
{
int a = 4, b = 3,c = 2, d = 1;
bool bl = a > b && b > c && c > d;
std::cout << std::boolalpha << bl << std::noboolalpha << std::endl;
return 0;
}
4.12
#include <iostream>
int main()
{
int i = 2, j = 20, k = 30;
// i != 1 为 true 赋值运算符 低于 关系运算符
bool bl = i != j < k;
std::cout << std::boolalpha << bl << std::noboolalpha << std::endl;
return 0;
}
4.13
#include <iostream>
int main()
{
int i; double d;
d = i = 3.5;
// 3 3.00
printf("%d %.2lf\n", i, d);
i = d = 3.5;
// 3 3.50
printf("%d %.2lf\n", i, d);
return 0;
}
4.14
#include <iostream>
int main()
{
int i = 10;
// 不是左值
if (42 = i) ;
// 返回 42 为 true
if (i = 42) ;
return 0;
}
4.15
#include <iostream>
using namespace std;
int main()
{
double dval;
int ival;
int *pi;
// int * 赋值给 int
// dval = ival = pi = 0;
dval = ival = 0;
pi = nullptr;
return 0;
}
4.16
#include <iostream>
using namespace std;
int main()
{
if ((p = getPtr()) != 0) ;
if (1 == 1024) ;
return 0;
}
4.17
/**
* 前置递增 返回改变后的值
* 后置递增 返回改变前的值
*/
4.18
/**
* 没有第一个值
* 解引用未定义值
*/
4.19
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int *ptr;
vector<int> vec{1, 2, 3 ,4};
int ival = -1;
// 指针不为空 && 不为空字符
// ptr != 0 && *ptr++
// ival != 0, ++iavl && ival != 0
if (ival++ && ival)
cout << ival << endl;
// 一直为真
while (vec[ival++] <= vec[ival])
cout << vec[ival] << endl;
return 0;
}
4.20
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> svec{"xi", "ao", "lg", "sn"};
vector<string>::iterator iter = svec.begin();
// 解引用后指针指向下一位
*iter++;
// 不合法 string没有++运算符
(*iter)++:
// 不合法 指针本身没有成员
*iter.empty();
// 第一个string是否为空
iter->empty();
// 不合法 string没有++运算符
++*iter;
// 第一个string是否为空, 指针指向下一个
iter++->empty();
return 0;
}
4.21
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> vec{1, 2, 3, 4, 5, 6, 7};
for (auto &i : vec)
i = i % 2 == 0 ? i : i * 2;
return 0;
}
4.22
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int i;
while (cin >> i && i <= 100 && i >= 0)
if (i >= 90)
cout << "high pass" << endl;
else if (i >= 60 && i <= 75)
cout << "low pass" << endl;
else if (i >= 60)
cout << "pass" << endl;
else
cout << "fail" << endl;
while (cin >> i && i <= 100 && i >= 0)
cout << (i >= 90 ? "high pass" :
i >= 60 && i <= 75 ? "low pass" :
i >= 60 ? "pass" : "fail") << endl;
return 0;
}
4.23
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
string s("word");
// 算术运算符 比 关系运算符高
string p1 = s + (s[s.size() - 1] == 's' ? "" : "s");
cout << p1 << endl;
return 0;
}
4.24
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
int i = 0;
// 左结合
cout << ( (i > 0) ? "i > 0" : i < 0 ? "i < 0" : "i == 0" ) << endl;
return 0;
}
4.25
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
char ch = 'q';
// 提升为 int 32 位
// 1110001000000
// 4096 + 2028 + 1024 + 64 = 7232
cout << (ch << 6) << endl;
return 0;
}
4.26
#include <iostream>
using namespace std;
int main()
{
unsigned int quizl = 0;
// 27位 为 1
quizl |= 1U << 31;
// 0100
// 1011
// 0000
// quizl &= ~(1U << 27);
bool status = quizl & (1u << 31);
cout << boolalpha << status << noboolalpha << endl;
return 0;
}
4.27
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
unsigned long ul1 = 3, ul2 = 7;
// 00011
// 00111 & |
// 0011 = 3 7
ul1 & ul2
ul1 | ul2
// true
ul1 && ul2
// true
ul1 || ul2
return 0;
}
4.28
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
printf("sizeof(bool) = %zd\n", sizeof(bool));
printf("sizeof(char) = %zd\n", sizeof(char));
printf("sizeof(short) = %zd\n", sizeof(short));
printf("sizeof(int) = %zd\n", sizeof(int));
printf("sizeof(long) = %zd\n", sizeof(long));
printf("sizeof(float) = %zd\n", sizeof(float));
printf("sizeof(double) = %zd\n", sizeof(double));
printf("sizeof(int*) = %zd\n", sizeof(int*));
printf("sizeof(long double) = %zd\n", sizeof(long double));
return 0;
}
4.29
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int x[10];
int *p = x;
// 10
cout << sizeof(x) / sizeof(*x) << endl;
// 2 指针8字节
cout << sizeof(p) / sizeof(*p) << endl;
return 0;
}
4.30
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
(sizeof x) + y
sizeof (p->mem[i])
(sizeof a) < b
sizeof (f())
return 0;
}
4.31
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
/**
* 不用后置版本 不用存储原值
*/
vector<int> ivec(4);
vector<int>::size_type cnt = ivec.size();
for (vector<int>::size_type ix = 0; ix != ivec.size(); ix++, cnt--)
ivec[ix] = cnt;
return 0;
}
4.32
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
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)
cout << *ptr << " ";
cout << endl;
return 0;
}
4.33
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
bool someValue = true;
int x = 10, y = 100;
int a = (someValue ? --x, --y : ++x, ++y);
cout << a << endl;
cout << x << " " << y << endl;
return 0;
}
4.34
/**
* bool
* double float
* double int
*/
4.35
/**
* char int
* float double double
* double float
* char float double
*/
4.36
/**
* i *= static_cast<int>(d);
*/
4.37
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int i; double d; const string *ps; char *pc; void *pv;
pv = static_cast<void*>(const_cast<string*>(ps));
i = static_cast<int>(*pc);
pv = static_cast<void*>(&d);
pc = static_cast<char*>(pv);
return 0;
}
4.38
/**
* j / i 的结果强制转换为 double 赋值给 slope
* double slope = static_cast<double>(j / i);
*/