C++ Primer(第五版)|练习题答案与解析(第二章:变量和基本类型)
本博客主要记录C++ Primer(第五版)中的练习题答案与解析。
参考:C++ Primer
C++ Primer
练习题2.1:
类型int、long、long long和short的区别是什么,无符号和带符号类型的区别是什么?float和double的区别是什么?
int、long、long long和short区别主要在可以表示的数据范围(尺寸)不同。
无符号数只能表示非负数,带符号的可以表示负数。
float为单精度浮点数,double为双精度,一般来说,float占4字节,double占8字节。执行浮点运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的代价相差无几。
练习题2.2
计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
利率使用unsigned double,其精度更高,且为非负数。
本金和付款使用unsigned float,精度要求不那么高,且为非负数。
练习题2.3
读程序,写结果
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl;
std::cout << u - u2 << std::endl;
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl;
std::cout << i - i2 << std::endl;
std::cout << i - u << std::endl;
std::cout << u - i << std::endl;
输出:
u2 - u:32
u - u2:4294967264 // -32的补码 4294967264
i2 - i:32
i - i2:-32
i - u:0
u - i:0
练习题2.5
(1)‘a’<字符字面值>, L’a’<宽字符字面值,类型是wchar_t>, “a”<字符串字面值>, L"a"<宽字符字符串字面值>
(2)10<十进制>, 10u<无符号整型>, 10L<长整型>, 10uL<无符号长整型>, 012<八进制>, 0xC<十六进制>
(3)3.14,<浮点数> 3.14f<单精度浮点型字面值,类型是float>, 3.14L<扩展精度浮点型字面值,类型是long double>
(4)10<十进制>, 10u<无符号整型>, 10.<浮点型>, 10e-2<浮点型字面值>
练习题2.6
int month = 9, day = 7;//定义的十进制数
int mouth = 09, dat = 07;//定义的八进制数,month会报错,因为已经超过8了。
练习题2.7
(1)“who goes with F\145rgus?\012”
输出who goes with Fergus?
这里使用的是转义序列,使用的Latin-1字符集,可查看 Latin-1。\145 后面是8进制数,表示的是101(182+481+5*80),对应的是小写数字e。
\012是换行符。
(2)3.14e1L
L是浮点型字面值的后缀。扩展的浮点型,类型是long double。
(3) 1024f
f是浮点型字面值的后缀。是单精度浮点型,类型是float。
(4) 3.14L
L是浮点型字面值的后缀。扩展的浮点型,类型是long double。
练习题2.8
使用转义序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。
测试
#include <iostream>
int main()
{
std::cout << "\62\115\012" ;
std::cout << "\62\t\115\012" ;
return 0;
}
输出:
2M
2 M
练习题2.9
(1)std::cin >> int input_value;
这个是错误的,不能在输入输出语句中定义变量。
(2) int i = { 3.14 };
错误,列表初始化且初始值存在丢失信息的风险,则编译器报错。
(3) double salary = wage = 9999.99;
如果wage没有定义,则报错。
如果wage定义,则该语句可以正常执行,且wage和salary相等。
(4) int i = 3.14;
这个可以运行,会丢失数据,i倍转换为3。
练习题2.10
下面变量的初始值分别是多少。
测试:
#include <iostream>
std::string global_str; //初始化为一个空串
int g_int; // 初始化为0
int main()
{
int local_int; //按标准局部变量不初始化,g++编译器下可能也会初始化为空
std::string local_str;
std::cout<<"global_str:"<<global_str<<std::endl;
std::cout<<"g_int:"<<g_int<<std::endl;
std::cout<<"local_int:"<<local_int<<std::endl;
std::cout<<"local_str:"<<local_str<<std::endl;
return 0;
}
输出:
global_str:
g_int: