标签:
2.1:类型int,long,long long和short的区别是什么?无符号类型和带符号类型的区别是什么?float和double的区别是什么?
解答:
一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。一般来讲short 最小16位 int 最小16位 long最小32位long 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是错误的,八进制没有9;day=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 变量 i 并初始化为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对象,r是i的别名。
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 常量,r是int型的引用,初始化为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;//g和ci绑定,无法通过赋值来改变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:赋值是会产生引用的一类典型表达式,引用的类型就是左值的类型。也就是说,如果i是int,则表达式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.1节1.5.2节1.6节的练习。眼下先把Sales_data类的定义和main函数放在同一个文件里。
解答:
标签:
原文地址:http://www.cnblogs.com/fastcam/p/5095171.html