2.1 类型 int、long、long long 和 short 的区别是什么?无符号类型和带符号类型的区别是什么?float 和 double的区别是什么?
答:C++ 规定 short 和 int 至少16位,long 至少32位,long long 至少64位。
带符号类型能够表示正数、负数和 0 ,而无符号类型只能够表示 0 和正整数。
2.5 指出下述字面值的数据类型并说明每一组内几种字面值的区别:
答:(a)字符,宽字符,字符串,宽字符串
(b)十进制整型,十进制无符号整型,十进制长整型,十进制无符号长整型,八进制整型,十六进制整型
(c)double, float,long double
(d)十进制整型,十进制无符号整型,double,double
2.6 下面两组定义是否有区别,如果有,请叙述之:
答:第一行定义的是十进制整型,第二行定义的是八进制整型。但是month变量有误,八进制不能直接写9。
2.7 下述字面值表示何种含义?它们各自的数据类型是什么?
答:
- (a) Who goes with Fergus?(换行),string 类型
- (b) long double
- (c) 无效,因为后缀
f
只能用于浮点字面量,而1024是整型。 - (d) long double
2.8 请利用转义序列编写一段程序,要求先输出 2M,然后转到新一行。修改程序使其先输出 2,然后输出制表符,再输出 M,最后转到新一行。
完成如下:
2.9 解释下列定义的含义,对于非法的定义,请说明错在何处并将其改正。
答:
(a): 错,应该先定义再使用。
(b): 错,用列表初始化内置类型的变量时,如果存在丢失信息的风险,则编译器将报错。
(c): 错,在这里wage
是未定义的,应该在此之前将其定义。
(d): 不报错,但是小数部分会被截断。
2.11 指出下面的语句是声明还是定义:
答:
(a): 定义 (b): 定义 (c): 声明
注
2.13 下面程序中j
的值是多少?
答:j
的值是100,因为局部变量i会
覆盖全局变量i
。
2.14 下面的程序合法吗?如果合法,它将输出什么?
答:合法,输出是 100 45 ,因为for循环里的变量i是重新定义了的,所以全局i与for里的局部i不是同一个!
注:
注意以下区别
2.15 下面的哪个定义是不合法的?为什么?
答:(b)和(d)不合法,(b)引用不能用常量直接赋值,(d)引用必须初始化。
2.17 执行下面的代码段将输出什么结果?
2.18 编写代码分别改变指针的值以及指针所指对象的值。
完成如下:
2.19 说明指针和引用的主要区别
答:引用是另一个对象的别名,而指针本身就是一个对象。 引用必须初始化,并且一旦定义了引用就无法再绑定到其他对象。
而指针无须在定义时赋初值,也可以重新赋值让其指向其他对象。
2.20 请叙述下面这段代码的作用。
答:让指针 pi 指向 i,然后将 i 的值重新赋值为 42 * 42 (1764)。
2.21 请解释下述定义。在这些定义中有非法的吗?如果有,为什么?
答:
- (a): 非法。不能将一个指向
double
的指针指向int
。 - (b): 非法。不能将
int
变量赋给指针。 - (c): 合法。
2.22 假设 p 是一个 int 型指针,请说明下述代码的含义。
答:第一句判断 p 是不是一个空指针, 第二句判断 p 所指向的对象的值是不是为0
2.24 在下面这段代码中为什么 p 合法而 lp 非法?
答:void *
是从C语言那里继承过来的,可以指向任何类型的对象。 而其他指针类型必须要与所指对象严格匹配。
2.26 下面哪些语句是合法的?如果不合法,请说明为什么?
答:
2.27 下面的哪些初始化是合法的?请说明原因。
答:
2.28 说明下面的这些定义是什么意思,挑出其中不合法的。
答:
2.29 假设已有上一个练习中定义的那些变量,则下面的哪些语句是合法的?请说明原因。
答:
2.30 对于下面的这些语句,请说明对象被声明成了顶层const还是底层const?
答:v2 是顶层const,p2 是底层const,p3 既是顶层const又是底层const,r2 是底层const。
2.32 下面的代码是否合法?如果非法,请设法将其修改正确。
答:
2.35 判断下列定义推断出的类型是什么,然后编写程序进行验证。
答:j 是 int, k 是 const int的引用, p 是const int *, j2 是const int, k2 是 const int 的引用。
2.36 关于下面的代码,请指出每一个变量的类型以及程序结束时它们各自的值。
答:c 是 int 类型,值为 4。d 是 int & 类型,绑定到 a,a 的值为 4 。