C++Primer第五版 第二章练习
2017-09-03 15:28
447 查看
2.1.1节练习
练习2.1: 类型int ,long ,long long 和 short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?练习2.2:计算按揭贷款时,对于利率、本金和付款分别应选择何种数据类型?说明你的理由。
答:
2.1int 是整形 ,最小尺寸16位。
long 是长整形,32位;
long long 也是长整型 最小尺寸为64位;
short为短整形,表示最小尺寸为8位。
无符号类型,举例来说,比如8位二进制存储单元,无符号类型表示的数为[0,-255],而有符号类型表示为[-128,-127],有符号类型的最高位表示正负,剩余位表示为数值。
float 和 double 都是浮点型,float表示单精度浮点数,6位有效数字; double为双浮点数,10位有效数字。
2.2:
利率应该选择double型,银行利率通常如3.5%,化成小数形式为0.035,因此选用double型比较好;
本金通常是一个具体的整数,如3500,4000等,因此使用int型基本满足要求;
而付款等于本金加本金乘以利率,为了保证精度,付款应当也选用double型。
2.1.2节练习
练习2.3:读程序写结果usinged 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;
练习2.4:编写程序检查你的估计是否正确,如果不正确,请仔细阅读本节直到弄明白问题所在。
答:
练习2.3:(1)正确,输出32.
(2)正确,输出的为取模后的值
(3)正确,输出32
(4)正确,输出-32
(5)正确,输出0
(6)正确,输出0
练习2.4
/* *2017-9-3 练习2.3-2.4 */ #include <iostream> int main() { 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; system("pause"); return 0; }
2.1.3节练习
练习2.5:指出下述字面值的数据类型并说明每一组内几种字面值的区别。
(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
练习2.6:
下面两组定义是否有区别,如果有,请叙述之?
Int month = 9, day = 7;
Int month = 09, day = 07;
练习 2.7:
下面字面值表示何种含义?它们各自的数据类型是什么?
(a) “Who goes with F\145rgus?\012”
(b) 3.14e1L (c)1024f (d)3.14L
练习 2.8:
请利用转义序列编写一段程序,要求先输出2M,然后换到新一行,修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。
答:
练习 2.5(a): 字符a ; 宽字符a; 字符串a相当于:两个字符a和\0;宽字符串a。
(b): 10;无符号数10;长整形10;无符号长整型10;八进制还是10;16进制代表13。
(c): 3.14;浮点数3.140000;长整型3.140000000 。
(d): 10,无符号数10,float型的10,0.1。
练习2.6
第一行: 9,7;
第二行:09错误的,八进制最大为7 ,就是7.
练习2.7
注:a. \145 ‘e’, \012 换行
(a) Who goes with Fe rgus?\n\0
(b)long double型3.14e1
(c)float型的1024
(d)long double型的3.14
练习2.8
#include <iostream> using namespace std; //M 对应的是\115 //制表符是\t int main() { cout << "2\115\012"<< endl; //输出2M 换行 cout << "2\t\115\12" << endl;//输出2 制表符 M换行 system("pause"); return 0; }
2.2.1节练习(变量定义)
练习2.9:(a) std::cin >> int input_value;
(b) int i = { 3.14 };
(c) double salary = wage = 9999.99;
(d) int i = 3.14;
练习2.10:
下列变量的初值分别是什么?
std::string global_str; int global_int; int main() { int local_int; std::string local_str; }
答:
练习2.9:(a)错误;input_value未被定义;
(b)警告;when you compile the code without the argument “-std=c++11”, you will get the warning below: warning: implicit conversion from ‘double’ to ‘int’ changes value from 3.14 to 3. —when you compile the code using “-std=c+11”, you will get a error below: error: type ‘double’ cannot be narrowed to ‘int’ in initializer list —conclusion: Obviously, list initialization becomes strict in c++11.
double i = { 3.14 };
(c) 错误;wage未定义;
(d)正确,但精度丢失,最终结果为3.
练习2.10:
std::string global_str; //空串 int global_int ; //0 定义为函数体外为0 int main() { Int local_int;//没有被初值化,内置类型函数内部不被初始化,显示为随机值 std::string local_str;//空串 }
2.2.2节练习(变量声明与定义的关系)
练习2.11指出下面的语句是声明还是定义:
a) extern int ix = 1024;
(b) int iy;
(c) extern int iz;
答:
练习2.11:(a) extern int ix =1024; //定义
(b) int iy; //声明并定义iy
(c) extern int iz; //仅声明iz
2.2.3节练习(标识符)
练习2.12:请指出下面的名字中哪些是非法的?(a) int double = 3.14;
(b) int _;
(c) int catch-22;
(d) int 1_or_2 = 1;
(e) double Double = 3.14;
答:
(a) int double = 3.14 //错误,关键字double不能做变量名(b) int _;//错误,标识符必须由字母,数字和下划线组成,但必须以字母或者下划线开头,函数体外的标识符也不能以下划线开头 //有不同答案
(c) int catch-22; //错误,不能有连字符
(d) int 1_or_2 = 1;//错误,不能以数字开头
(e) double Double = 3.14;//正确
2.2.4节练习(名字的作用域)
练习2.13 下面程序中j的值是多少?int i = 42; int main() { int i = 100; int j = i; }
练习 2.14: 下面程序合法吗?如果合法?它将输出什么?
int i = 100, sum = 0; for (int i = 0; i != 10; ++i) sum += i; std::cout << i << " " << sum << std::endl;
答:
练习2.13输出为100;
练习2.14
45; (1+2+3…+9)//for循环中I 是局部变量 出了循环就没用了
2.3.1节练习(引用)
练习2.15: 下面的那个定义是不合法的?为什么?(a) int ival = 1.01;
(b)int&rvall = 1.01;
(c) int &rval12 = ival;
(d): int &rval13;
练习 2.16:考查下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行力什么样的操作?
int i = 0, &r1=i; double d = 0, &r2 =d;
(a) r2 = 3.14159;
(b) r2= r1;
(c) i= r2;
(d) r1 = d;
练习2.17: 执行下面的代码段将输出什么结果?
int i, &ri = i; i= 5; ri= 10; std::cout<< i << " " << ri << std::endl;
答:
练习2.15:(a)合法,但赋值后精度丢失,变成1
(b)不合法,引用需要与一个变量绑定,不能直接赋值
(c)合法
(d)不合法,没有初始化,引用必须要和一个对象绑定
练习2.16:
(a)合法,r2与d绑定,相当于将d的值修改为3.14159
(b)合法,r1是int 型,r2 是double型,相当于将i的值赋给d,精度不丢失
(c)不合法,double型d赋值给int型I 报错,精度丢失
(d)不合法,高精度赋值给低精度的值,不合法
练习2.17:
由于ri和i绑定,因此对ri赋值相当于对i赋值,第一次i赋值为5,第二次ri赋值为10,相当于将i重新赋值,因此输出结果为10 10
2.3.2节练习(指针)
练习2.18:编写代码分别更改指针的值以及指针所指对象的值。
练习2.19:说明指针和引用的主要区别。
练习 2.20: 请叙述下面这段代码的作用。
int i = 42; int*p1 = &i; *p1= *p1 * *p1;
练习 2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i = 0; (a)double *dp = &i; (b)int *ip = i; (c)int *p = &i;
练习2.22:假设p是一个int型指针,请说明下述代码的含义
if(p) //.. if(*p) //…
练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
练习2.24: 在下面这段代码中为什么p合法而lp非法/
int i = 42; void *p = &i; long *lp =&i;
答:
练习2.18:int a = 0, b = 1; int *p1 = &a, *p2 = p1; // change the value of a pointer. p1 = &b; // change the value to which the pointer points *p2 = b;
练习2.19:说明指针和引用的主要区别。
定义:
指针是“指向”任何其他类型的对象。
引用是对象的“另一个名称”。
关键的区别
1. 引用是已经存在的对象的另一个名称。指针本身就是一个对象。
2. 初始化后,引用仍然绑定到它的初始对象。无法重新绑定引用来引用不同的对象。一个指针可以被分配和复制。
3. 引用总是获取引用最初被绑定的对象。一个指针可以在它的生命周期中指向几个不同的对象。
4. 必须初始化引用。指针在定义的时候不需要初始化。
练习 2.20: 请叙述下面这段代码的作用。
int i = 42; int*p1 = &i; *p1= *p1 * *p1;
*p1是间接访问i的,p1中存放的是i的地址,因此实际是通过指针p1间接修改了i的值,是i的值变成了42×42.
练习 2.21:请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
int i = 0; (a)double *dp = &i; (b)int *ip = i; (c)int *p = &i;
(a)非法,前后类型不一致 (b)非法,指针存放是一个对象的地址,而非对象本身 (c)合法
练习2.22:假设p是一个int型指针,请说明下述代码的含义
if(p) //.. if(*p) //…
if(p) //.. //如果p存放的地址不为空,即p存放的地址存在,条件为真,向下执行
if(*p) //… //如果,p指向的int型对象的值不等于0,条件为真,向下执行。
练习2.23:给定指针p,你能知道它是否指向了一个合法的对象吗?如果能,叙述判断的思路;如果不能,也请说明原因。
不能判断指针p是否指向了一个合法的对象,因为如果指针p没有被初始化,p存放的是一个随机的地址,这是一件极其危险的事情,再者,如果p没有被合法的初始化,恶意存放了一个地址,也是危险的。所以,需要程序员自己清楚指针是否被合法使用。
练习2.24: 在下面这段代码中为什么p合法而lp非法/
int i = 42; void *p = &i; long *lp =&i;
void*是一种特殊的指针类型,可以用于存放任意对象的地址。第三个两者类型不一,当然报错,和赋值不一样,指针要求两边类型严格一致(有特例,47页说其他章节会介绍)
2.3.3节练习(理解复合类型的声明)
练习2.25:说明下列变量的类型和值。(a) int * ip , i ,&r = i;
(b) int i , *ip = 0;
(c) int* ip, ip2;
答:
(a)ip为int指针,未赋值;i为int型;r为引用,对i的引用,值不确定;(b)i为int型;ip为int型的空指针,存放地址为空;
(c)ip存放的是地址,指向一个int型对象,值不确定;ip2是一个int型对象,值不确定。
2.4节练习(const限定符和extern const)
练习2.26:下面那些句子是合法的?如果有不合法的句子,请说明为什么?(a)const int buf; (b)int cnt = 0; (c)const int sz = cnt; (d)++cnt; ++sz;
答:
(a)不合法,const对象必须初始化;(b)合法,cnt是int型,初始化为0;
(c)合法,sz的值需要看cnt;
(d)如果根据(c)项来看,不合法,sz不能自增;
2.4.2节练习(const的引用,指针与const)
练习2.27:下面的哪些初始化是合法的?请说明原因。(a)int i = -1,&r = 0; (b)int *const p2 = &i2; (c) const int i = -1, &r = 0; (d) const int *const p3 =&i2; (e) const int *p1 = &i2; (f). const int &const r2; (g) const int i2 = i, &r = i;
练习2.28 :说明下面的这些定义是什么意思,挑出其中不合法的。
(a) int i ,*const cp; (b) int *p1 ,*const p2; (c) const int rc, &rc =ic; (d) const int *const p3; (e) const int *p;
练习2.29:假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。
(a)i = ic; (b) p1 = p3; (c) p1 = ⁣ (d) p3 = ⁣ (e) p2 = p1; (f) ic =* p3;
答:
练习2.27:(a)非法,int &r = 0。错误 ;
(b)合法 p2是一个常量指针,一直存放i2的地址,不能变动,但能间接改动i2的值
(c)合法
(d)合法 p3是一个常量指针,一直存放i2的地址,且不能通过修改p3来修改i2的值
(e)合法,p1存放i2的地址,不能通过修改p1来改变i2的值,但p1本身存放的地址是不是可以变化?
(f) 非法 引用本身不是一个对象
(g)合法
练习2.28:
(a) 不合法,没有初始化
(b) 不合法,没有初始化
(c) 不合法,前一半没有初始化,后一半类型不对应
(d) 不合法 没有初始化
(e) 不合法 没有初始化
练习2.29:
(a)用const int 赋值 可以
(b)p1是int指针 p3是const int 指针 无法从“const int const”转换为“int ”
(c) 无法从“const int const ”转换为“int ”
(d)如果这句是初始化 可以!!已经初始化过,不行
(e)因为p1指向的对象可能发生变化 ,不合法
(f)ic不能被赋值
相关文章推荐
- C++ Primer Plus第五版 第二章 编程练习答案
- C++Primer第五版 2.2.1节练习
- C++Primer第五版 3.5.2节练习
- C++Primer第五版 6.2.4节练习
- C++Primer第五版 7.1.3节练习
- c++ primer plus(第6版)中文版 第二章编程练习答案
- C++Primer第五版 第二章习题答案(11~20)
- C++Primer第五版 练习12.2
- C++ Primer Plus第五版 第七章 编程练习答案
- C++ Primer Plus第五版 第八章 编程练习答案
- C++Primer第五版 1.5.1节练习
- C++Primer Plus 第二章编程练习个人答案
- C++Primer第五版 第3章 字符串、向量和数组(练习解答)
- C++Primer第五版 4.1.2节练习
- C++Primer第五版 6.2.6节练习
- C++ Primer Plus第五版 第十三章 编程练习答案
- C++Primer第五版 12.1.6节练习
- C++Primer第五版 练习11.24(解答)
- C++ Primer Plus第五版 第10章 编程练习答案
- C++ Primer Plus 第五版 第七章 编程练习 5 6