2.1 What are the differences between int, long, long long, and short? Between an unsigned and a signed type? Between a float and a double?
大意:short,int,long,long long有什么不同,unsigned和signed有什么不同,float和double有什么不同?
第一,关于整型
short,int,long,long long都是整型,但是在c++中有些特别,在c++中这些类型到底占用多少空间,往往需要自己测试一下才能知道,但是原则上,int要不小于short,long要不小于int
第二,关于符号
unsigned是无符号,sigend是有符号,也就是unsigned无法表示负数
第三,关于浮点数
float是单精度浮点数,double是双精度浮点数,占用空间上来说,double要高于float,同样精确度上,double也要好于float
2.2 To calculate a mortgage payment, what types would you use for the rate, principal, and payment? Explain why you selected each type.
大意:在计算钱的时候,利率,本金和付款,选用什么类型比较好
一般来说,涉及到钱的计算,用整型来存放比较好。因为浮点数在进行计算的时候,有无法计算精确的特点。但是钱是特别需要精确计算的,哪怕是少了或者多了一分钱,也是不可以的。因此在这种情况下,如果没有专门的类型可以使用的话,使用整型存放是比较好的选择。
但是这里面提到的是利率,本金和付款,好像也不像是传统的存取钱,应该可以使用double类型计算。
2.3 What output will the following code produce?
// 程程补充注释:以下代码为书中代码,并非我写的 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 - u1的结果为32,这是确定的
u - u2的结果是不确定的,可能是4294967264
i2 - i的结果为32
i - i2的结果为-32
i - u的结果为0
u - i的结果同样为0
结论:最好不要混合使用不同类型的数字进行运算,尤其是在有符号和无符号同时存在的情况下
2.4 Write a program to check whether your predictions were correct. If not, study this section until you understand what the problem is.
大意:运行一下2.3的程序,看看和你想的一样吗
2.3的程序加上#include <iostream>和int main()就可以运行了
2.5 Determine the type of each of the following literals. Explain the differences among the literals in each of the four examples:
(a) 'a', L'a', "a", L"a"
(b)10, 10u, 10L, 10uL, 012, 0xC
(c)3.14, 3.14f, 3.14L
(d)10, 10u, 10., 10e-2
大意:说明它们的区别
a
'a'是单引号,显然是一个字符
L'a'带有L,是宽字符,类型是wchar_t
"a"是双引号,显然是一个字符串
L"a"带有L和双引号,是宽字符的字符串
b
10是一个普通的整型
10u是一个无符号的整型
10L是一个长整型
10uL是无符号的长整型
012是一个八进制的数字
0xC是一个十六进制的数字
c
3.14是浮点型
3.14f是单精度浮点型
3.14L是长双精度浮点型
d
10是一个普通的整型 (这句话好像刚刚说过一遍)
10u是一个无符号的整型(???这句话好像也说过一遍?)
10.是一个浮点数
10e-2是一个科学计数法表示的浮点数
2.6 What, if any, are the differences between the following definitions:
int month = 9, day = 7;
int month = 09, day = 07;
大意:这两种定义有什么区别
乍看之下,没什么区别啊,这不是一样的吗,09不也是9吗?
当然不是,09是一个八进制数,9是一个十进制数,所以他们当然是不一样的
不过一般来说,由于大多数人用到八进制数的时候可能并不多,所以有的时候看到了不一定反应的过来
当然,这里还有一个问题在于,这个09真的是对的吗?他真的是一个八进制数吗?八进制里面有9吗???
所以说,这个题目仔细一看的话,不是一个八进制数,是一个错误定义的八进制数,啊,好坑啊。
2.7 What values do these literals represent? What type does each have?
(a) "who goes with F\145rgus?\012"
(b)3.14e1L
(c)1024f
(d)3.14L
大意:这些值是什么?
a,这显然是一个字符串,但是唯一需要考虑的问题是\145和\012是什么东西?显然是两个转义字符,并不会影响到本身是一个字符串
b,科学计数法,long double,最终是31.4
c,1024f,看起来是一个浮点数,但是它又没有点,所以这个编译器不一定能通过(当然也可能是一定不能通过,那我就不清楚了)
d,3.14L,长精度浮点类型,也还是3.14
2.8 Using escape sequences, write a program to print 2M followed by a newline. Modify the program to print 2, then a tab, then an M, followed by a newline.
大意:使用转义字符输出一段文字,2M换行2制表符M换行
大概应该是这样吗?至少从结果上看,和要求应该挺像的了
#include <iostream>
using namespace std;
int main()
{
cout << "\x32\x4d\12";
cout << "\x32\x09\x4d\12";
}
2.9 Explain the following definitions. For those that are illegal, explain what's wrong and how to correct it.
(a) std::cin >> int input_value;
(b) int i= { 3.14 };
(c) double salary = wage = 9999.99;
(d) int i = 3.14;
大意:解释这些定义,如果有不合理的定义,请说明理由并改正
a,这个是不对的,在使用std::cin的时候,不可以使用变量定义,应该先定义变量,再使用std::cin。
int input_value;
std::cin >> input_value;
b,是可以通过编译的,但是定义的i为整型变量,将3.14赋值给i的时候,会被强制转换为3。
c,这里分为两种情况
如果wage之前未被定义,那么在这里是错误的,使用double salary = wage的方法,不会定义wage变量,因此是错误的。
double wage;
double salary = wage = 9999.99;
如果之前wage已经定义,那么这里就是可以通过的了。不过仅从题目给出的信息来看,应该是前一种情况,wage未定义。
d,这个和b没有什么本质区别,只是写法看上去有些不同而已,也是可以通过编译,但是由于值的范围缩小而被警告的情况。
2.10 What are the initial values, if any, of each of the following variables?
// 程程注释:以下的代码不是我写的,是c++primer5书中给出的 std::string global_str; int global_int; int main() { int local_int; std::string local_str; }
大意:这些变量的初始值是什么?
因为string有默认的构造函数,所以global_str和local_str都应当为空字符串。
global_int是被放在全局变量中的整型,值应当被初始化为0。
local_int是被放在局部变量中的整型,值应当未定义,也就是不知道local_int的值是什么。