码迷,mamicode.com
首页 > 编程语言 > 详细

19天学完C++Primer【2】

时间:2016-01-02 22:24:53      阅读:800      评论:0      收藏:0      [点我收藏+]

标签:

2.1:类型int,long,long longshort的区别是什么?无符号类型和带符号类型的区别是什么?floatdouble的区别是什么?

解答:

一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。一般来讲short 最小16位 int 最小16位 long最小32long long最小64位。float单精度浮点数,6位有效数字。double双精度浮点数10位有效数字。无符号类型和有符号类型区别在于有符号类型存在负值。

2.2:计算按揭贷款时,对于利率、本金和付款分别对应选择何种数据类型?说明你的理由。

解答:double或者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 -1<<std::endl;
std::cout<<i-i2<<std::endl;
std::cout<<i-u<<std::endl;
std::cout<<u-i<<std::endl;

 

解答:

32 
4294967264 
32 
-32
 0
 0 

2.4:编写程序检查你的估计是否正确,如果不正确,请仔细研读本节直到弄明白问题所在。

解答:

 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

解答:

a)char wchar_t char[] wchar_t[]

b)int,unsigned int,long,unsigned long,8进制(octal)16进制(hexadecimal)

c)double,float,long double

d)int,unsigned int,double,double

2.6:下面两组定义是否有区别,如果有,请叙述之:

int month = 9,day = 7;

int month = 09,day =07;

解答:第一行是十进制

第二行month=09是错误的,八进制没有9day=07是正确的。

2.7:下述字面值表示何种含义?它们各自的数据类型是什么?

(a)”Who goes with F\145rgus?\012”

(b)3.14e1L (c)1024f (d)3.14L

解答:

(a): Who goes with Fergus?(new line) "string" 

(b): 31.4 "long double" 

(c): 1024 "float" 

(d): 3.14 "long double"

2.8:请利用转移序列编写一段程序,要求先输出2M,然后转到新一行。修改程序使其先输出2,然后输出制表符,再输出M,最后转到新一行。

解答:

#include <iostream>  
int main() { 
  std::cout << 2 << "\115\012";  
 std::cout << 2 << "\t\115\012";  
  return 0;
 } 

2.9:解释下列定义的含义。对于非法的定义,请说明错在何处并将其改正。

(a)std::cin>>int input_value; (b)int i ={3.14};

(c)double salary =wage =9999.99; (d)int i =3.14;

解答:

a) int input_value;
cin>>input_value;
b)double i={3.14};
c)double wage;
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;
}

 

解答:

std::string global_str;//空串
int global_int;//0
int main()
{
    int local_int;//不确定的随机值。
    std::string local_str;//空串
}

2.11:指出下面的语句是声明还是定义:

(a)extern int ix =1024;

(b)int iy;

(c)extern int iz;

解答:

a)定义 b)定义 c)声明

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,c,d是非法的。

 

2.13:下面程序中j的值是多少?

int i=42;
int main()
{
    int i=100;
    int j =i;
}

 

解答:100;局部对象与全局对象命名相同时会隐藏全局对象而采用局部对象。

 

2.14:下面的程序合法吗?如果合法,它将输出什么?

int i = 100,sum = 0;
for(int i =0 ;i!=10;++i)
{
sum+=i;
}
std::cout<<i <<” ”<<sum<<std::endl;

解答:

合法,打印100,45

2.15:下面的哪个定义是不合法的?为什么?

(a)int ival = 1.01;

(b)int &rvall = 1.01;

(c)int &rval2 = ival;

(d)int &rval3;

解答:

a)合法。

b)不合法。引用初始化必须是一个对象。

c)合法。

d)不合法。引用变量必须初始化。

2.16:考察下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?

int i =0,&ri = i; double d =0 ,&r2 = d;

(a) r2 =3.14159;

(b) r2 = r1;

(c) i =r2;

(d) r1 =d ;

解答:

a)合法。d会赋值为3.14159

b)合法。值自动转换。

c)合法。值将丢失。

d)合法。值将丢失。

2.17:执行下面的代码段将输出什么结果?

int i,& ri = i;

i = 5; ri =10;

std::cout<<i<<” ”<<ri<<std::endl;

解答:

10,10

2.18:编写代码分别更改指针的值以及指针所指对象的值。

解答:

int a = 0, b = 1;

int *p1 = &a, *p2 = p1; 

p1 = &b;  

*p2 = b;

2.19:说明指针和引用的主要区别。

解答:

指针是保存内存地址值,而引用是别名。

2.20:请叙述下面这段代码的作用。

int i =42;

int *pi = &i;

*pi=*pi* *pi;

解答:

定义一个int 变量 并初始化为42

pi指向i的地址 ;

i= i*i;

 

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是非空指针nullptr?

if(*p)//如果指针p指向的内容是真

 

2.23:给定指针p,你能知道它是否指向了一个合法的对象么?如果能,叙述判断的思路:如果不能,也请说明原因。

解答:不能,还需要确定指针是有效的还是无效的。

2.24;在下面这段代码中为什么p合法而lp非法?

int i =42; void *p =&i; long *lp =&i;

解答:空指针可以指向任何对象,带有类型的指针只能指向其类型对象的地址。

 

2.25:说明下列变量的类型和值

(a)int*ip,i,&r=i;

(b)int i, *ip = 0;

(c)int* ip, ip2;

解答:

a):ip是一个int指针,i是一个int对象,ri的别名。

b):i是一个int对象,p是一个int类型的空指针。

c):ip是一个int指针,ip2是一个int对象。

2.26:下面哪些句子是合法的?如果有不合法的句子,请说明为什么?

(a)const int buf;

(b)int cnt = 0;

(c) const int sz =cnt ;

(d)++cnt; ++sz;

解答:

(a)const int buf;//非法const 必须初始化

(b)int cnt = 0;//合法

(c) const int sz =cnt ;//合法

(d)++cnt; ++sz;//非法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;

解答:

(a)int i = -1,&r = 0; //非法 r必须用对象初始化
(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;//非法 引用不能使用const
(g)const int i2 = i;&r =i;

 

 

2.28:说明下面的这些定义是什么意思,挑出其中不合法的。

(a)int i,*const cp;

(b)int *p1,*const p2;

(c)const int ic,&r=ic;

(d)const int *const p3;

(e)const int *p;

解答:

(a)int i,*const cp;//非法,cp没有初始化,一个int对象i,一个int型指针常量cp

(b)int *p1,*const p2;//非法,cp没有初始化,一个int指针i,一个int型指针常量cp

(c)const int ic,&r=ic;//非法,ic没有初始化,ic:int 常量,rint型的引用,初始化为ic保存的值。

(d)const int *const p3;//非法,p3没有初始化;p3是一个常量指针指向常量。

(e)const int *p;//合法,p是一个常量指针

 

2.29:假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。

(a)i = ic;

(b)p1 =p3;

(c)p1 =&ic

(d)p3=&ic

(e)p2 =p1;

(f)ic=*p3;

解答:

(a)i = ic;//合法
(b)p1 =p3;//非法
(c)p1 =&ic//非法
(d)p3=&ic//非法
(e)p2 =p1;//非法
(f)ic=*p3;//非法

 

2.30:对于下面的这些语句,请说明对象被声明成了顶层const还是底层const

const int v2 = 0;

int v1 = v2;

int *p1 =&v1, &r1 =v1;

const int *p2 =&v2, *const p3=&i,&r2 =v2;

解答:

v2顶层const,

p2底层const 

p3右值是顶层const ,左值是底层const

r2底层const

2.31:假设已有上一个练习中所作的那些声明,则下面的那些语句是合法的?请说明顶层const和底层const在每个例子中有何体现。

r1=r2;

p1=p2;

p2=p1;

p1=p3;

p2=p3;

解答:

r1 = v2 ; // 合法,可以 顶层const拷贝没有什么影响 

p1 = p2; // 非法 非常量可以转化成常量 反之不行 

p2 = p1;// 合法 

p1 = p3;// 非法 非常量可以转化成常量 反之不行 

p2 = p3;// 合法。执行拷贝操作并不会改变被拷贝对象的值,因此,拷入和拷出的对象是否是常量都没什么影响 底层const拷贝要看两边的类型是否一致。

2.32:下面的代码是否合法?如果非法,请设法将其修改正确。

int null = 0,*p = null;

解答:

非法int null = 0, *p = nullptr; 

2.33:利用本节定义的变量,判断下列语句的运行效果。

a = 42;b = 42; c =42; d =42; e = 42; g = 42;

解答:

 

2.34:基于上一个练习中的变量和语句编写一段程序,输出赋值前后变量的内容,你刚才的推断正确吗?如果不对,请反复研读本节的示例直到你明白错在何处为止。

解答:

const int ci = i, &cr = ci;
auto b = ci; 
// int b = ci;
auto c = cr; 
// int c = cr;
auto d = &i; 
// int * d = i;
auto e = &ci;
// const int * e = &ci;
const auto f = ci; 
// const int f = ci;
auto &g = ci;  
// const int &g =ci;
//auto &h = 42;

 

a = 42;//正确。i,r,的值变为42

b = 42;//正确,b的值变为42 

c = 42;//正确,c的值变为42 

d = 42;// d是指向i的整型指针,不能赋值 

e = 42;//e是指针,不能赋值 

g = 42;//gci绑定,无法通过赋值来改变ci

 

2.35:判断下列定义推断出的类型是什么,然后编写程序进行验证。

const int i =42;

auto j =i;const auto &k=i;

auto *p =&i;

const auto j2 =i,&k2 =i;

解答:

const int i = 42; 

auto j = i; //int j = i; 

const auto &k = i; //const int &k = i; 

auto *p = &I; //const int *p = &i; 

const auto j2 = i, &k2 = I; //const int j2 = i, &k2 =i;

2.36:关于下面的代码,请指出每一个变量的类型以及程序结束时它们各自的值。

int a = 3, b = 4;

decltype(a) c = a;

decltype((b)) d = a;

++c;++d;

解答:int a,int b,int c,int& d;a=4, b=4, c=4, d=4

 

2.37:赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型。也就是说,如果iint,则表达式i=x的类型是int&。根据这一特点,请指出下面的代码中每一个变量的类型和值。

int a = 3, b = 4;

decltype(a) c =a ;

decltype(a = b) d = a;

解答:int a,int b,int c,int& d;a=3, b=4, c=3, d=3 

 

2.38:说明由decltype指定类型和由auto指定类型有何区别。请举出一个例子decltype指定的类型与auto指定的类型一样;在举一个例子,decltype指定的类型与auto指定的类型一样。

解答:

decltype在处理顶级常量和引用时与auto不同。decltype保留了const 和 引用而auto没有。

int i = 0, &r = i;

// same

auto a = i;

decltype(i) b = i;

// different 

auto c = r;

decltype(r) d = i;

 

2.39:编译下面的程序观察其运行结果,注意,如果忘记写类定义体后面的分号会发生什么情况?记录下相关信息,以后可能会有用。

struct Foo{}//注意没有分号

int main()

{

return 0;

}

解答:不要这么做。

 

2.40:根据自己的理解写出Sales_data类,最好与书中的例子有所区别。

解答:

 

2.41;使用你自己的Sales_data类重写1.5.11.5.21.6节的练习。眼下先把Sales_data类的定义和main函数放在同一个文件里。

解答:

19天学完C++Primer【2】

标签:

原文地址:http://www.cnblogs.com/fastcam/p/5095171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!