3.13 问题
1. 1个字符占了一个byte。范围为-128~127;整数类型有short, int, long, 分别占了2,4,8个byte。范围麻烦自己动手算~(233333)
2. 浮点数类型有float, double,分别占4,8个byte。
3.
/*在32位机器上*/ typedef signed char int8; typedef short int16; typedef int int32; typedef int defint8; typedef int defint16; typedef int defint32; /*在16位机器上*/ typedef signed char int8; typedef int int16; typedef long int32; typedef int defint8; typedef int defint16; typedef long defint32;
4. 首先要说的是,把long整型变量赋值给short整型变量会按二进制截断。如果该long类型的整型变量的值没有超过short类型能表示的值的范围,那问题不大;但是如果超过能表示值的范围,就可能造成数据丢失,轻者程序与预期结果不符合,重者程序崩溃。每种编译器都可能会有不同的结果值。
5. 浮点数把double变量赋值给一个float变量其实是一样的道理,会按二进制截断。(同上原理)
6.
enum COIN { PENNY = 1, NICKEL = 5 };
7. 打印不了,会提示程序错误无法编译。jar的值实际上是整数。%s用于打印字符串而不是整数。
8. P34:许多编译器都允许程序修改字符串常量(K&R C);许多ANSI编译器不允许修改字符串常量(ANSI C)。
9. 可能signed的作用就在于整数家族中有个不容易分辨的家伙(char),它缺省时有可能是signed,也有可能是unsigned。
10. 不可能。相同长度说明二进制位数相同,则可以表示的值的数量是相同的,只是无符号的不能表示负数且比有符号的能表示的正数多。
11. 如果int和float都是32位,则能表示的值的数量讲道理是一样的。但是如果了解了浮点数的表示方法,则知道浮点数有三种大分类:规格化数、不规格化数和特别数(例如NaN),其中特别数占用了一些数量,导致float能表示的值的数量其实比int少。
12.
/*给变量分配存储空间并赋值*/ int a = 25; /*先给变量分配存储空间,但是变量的值是随机的(垃圾值)*/ int a; /*然后再给变量赋想要的值*/ a = 25;
13. 如果声明中包含const,那么只有第一种可以完成任务,第二种是不行的。
14. 错。一般情况下在代码块内部声明的变量只有在代码块内部才能访问,是为局部变量。但是如果声明的变量前面有extern关键字,那么它就为全局变量,就可以从该代码块的任何位置根据名字来访问。
15. 对。
16. 如果x被声明为static,那么答案就是错。static有两种用途:(1):当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。(2):当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。
17. 不需要添加额外的说明。
18. 不会。
19. 不需要添加额外的说明。
20. 如果问题19中的声明包含了关键字static,那么变量只能在声明的源文件中被访问,其他源文件不能访问。
21. 值有可能相同不过概率太低。函数被重复调用,自动变量每次都将重新创建。在代码块再次执行时,这些自动变量在堆栈中所占据的内存位置有可能和原先的位置相同,也可能不同。即使它们所占据的位置相同,你也不能保证这块内存同时不会有其他的用途。因此,我们可以说自动变量在代码块执行完毕后就消失。当代码块再次执行时,它们的值一般并不是上次执行时的值。
22. 如果出现在代码块内部,则为局部变量;如果出现在代码块外部,则为全局变量。
23.
char b = ‘2’; int y() { } int a = 1; int x() { int c = 3; static float d = 4; }
24.
/*根据变量出现的早晚给变量从1取名,好分辨。当然,这只是方便说明*/ static int w1 = 5; extern int x1; static float func1(int a1, int b1, int c1) { int c2, d1, e1 = 1; ... { int d2, e2, w2; ... { int b2, c3, d3; static int y1 = 2; ... } } ... { register int a2, d4, x2; extern int y2; ... } } static int y3; float func2(int a3) { extern int y4; static int z1; ... }
作用域如下:
a1: 6~18;23
a2: 19~22
a3: 28~31
b1: 6~11; 16~23
b2: 12~15
c1: 没有
c2: 6~11; 16~23
c3: 12~15
d1: 6~8; 17~18; 23
d2: 9~11; 16
d3: 12~15
d4: 19~22
e1: 6~8; 17~23
e2: 9~16
w1: 1~8; 17~31
w2: 9~16
x1: 2~18; 23~31
x2: 19~22
y1: 13~15
y2: 20~23
y3: 24~27
y4: 28~31
z1: 29~31