C和指针(POINTERS ON C) 第三章课后习题答案

  1. 假定你要写一个程序要在两台机器上都能运行,它们的默认整型大小不同,分别是16位和32位,长整型大小分别是32位和64位,一些足够小的值可以适合任意一台机器,但是一些比较大的值要求用32位,一个可能简单的办法是对所有的值都使用长整型,但是这种方法对于能够在16位机器上运行的就会浪费时间和空间,在32位机器上也存在时间和空间的浪费问题,你如何声明这些变量使他们在两种机器上都能运行,正确的方法是避免在任意一台机器上编译程序之前更改它们的声明,提示:尝试在一个头文件中包含对不同机器的特殊声明

答:在32位机器上
typedef signed char-----------int8
typedef short int----------------int16
typedef int-----------------------int32
typedef int-----------------------defint8
typedef int-----------------------defint16
typedef int-----------------------defint32

在16位机器上
typedef signed char-----------int8
typedef int------------------------int16
typedef long int------------------int32
typedef int------------------------defint8
typedef int------------------------defint16
typedef long int-----------------defint32

  1. 假定你有一个程序,他把一个long整形变量赋值给一个short整形变量。当你编译程序时会发生什么情况?当你运行程序时会发生什么情况?你认为其他编译器的结果是否也是如此?

答:编译没警告和错误,运行没警告和错误。
我认为其他编译器会由警告提示,因为数据溢出时,会丢弃高位,导致错误

  1. 同4.无任何警告错误,略。
  2. 编写一个枚举声明,用于定义硬币的值。请使用符号PENNY, NICKEL等。
enum Coin{ PENNY = 1,NICKEL = 5, DIME = 10,
         QUARTER = 25, HALF_DOLLAR = 50, DOLLAR = 100};
  1. 下列代码段会打印出什么东西?
enum Liquid { OUNCE = 1, CUP = 8, PINT = 16, QUART = 32, GALLON = 128 };
enum Liquid jar;
....
jar = QUART;
printf( "%s\n", jar );
jar = jar + PINT;
printf( "%s\n", jar );

输出:32
	 48
编译警告,枚举被当作整形常量处理,所以print时要用%d,而不是%s
  1. 你所使用的C编译器是否允许程序修改字符串常量?是否存在编译器选项允许或禁止你修改字符串常量?

答:K&RC并没有提及一个字符串常量中的字符是否可以被程序修改,但它清楚地表明具有相同的值的不同字符串常量在内存中时分开存储的。因此,许多编译器都允许程序修改字符串常量。
ANSI C声明,如果对一个字符串常量进行修改,其效果是未定义的。它也允许编译器把一个字符串常量存储于一个地方,即使它在程序中多次出现。这就使得修改字符串常量变得极为危险,因为对一个常量进行修改可能殃及程序中其他字符串常量。因此,许多ANSI编译器不允许修改字符串常量,或者提供编译时选项,让你自行选择是否允许修改字符串常量。在实践中,庆尽量避免这样做。如果你需要修改字符串,请把它存储于数组中。
我的编译器中字符串常量不能被修改
9. 如果整数类型在正常情况下是有符号类型,那么signed关键字的目的何在?

答:加入默认是没有符号类型呢?

  1. 一个无符号变量可不可以比相同长度的有符号变量容纳更大的值?

答:否。任何给定的n个位的值都只有2^n个不同组合。signed和unsigned的不同在于signed的负数相当于unsigned正数的更大的值。

  1. 假如int和float类型都是32位长,你觉得哪种类型所能容纳的值精确度更大?

答:这题看不懂。抄来的答案:float的范围比int大,但如果它的位数不比int更多,它并不能比int表示更多不同的值。前一个问题的答案已经提示了它们应该能够表示的不同值得数量是相同得,但在绝大多数浮点系统中,这个答案是错误的。零通常有许多表示形式,而且通过使用不规范的小数形式,其他值也具有多种不同的表示形式。因此,float能够表示的不同值的数量比int少。

  1. 下面是两个代码片段,取自一个函数的起始部分。
int a = 25;

int a;
a = 25;

它们完成任务的方式有何不同?

答:第一个是定义时直接初始化为25,另一个是定义后a被初始化为0,然后赋值25。

  1. 如果问题12中代码片段的声明中包含有const关键字,它们完成任务的方式又有何不同?

答:const只能初始化,不能赋值。。略。

  1. 在一个代码块内部声明的变量可以从该代码块的任何未知根据名字来访问,对是错?

答:如果代码块内部嵌套了一个相同名字的变量,嵌套外的变量在嵌套内就会被隐藏。

  1. 假定函数a声明了一个自动整型变量x,你可以在其他函数内访问变量x,只要你使用了下面这样的声明:
    extern int x;
    对还是错?

答:错。自动整型变量只能在函数内被访问。

  1. 假定问题15的变量x被声明为static。你的答案会不会发生变化?

答:不变

  1. 假定文件a.c的开始部分有下面这样的声明:int x;
    如果你希望从同一个源文件后面出现的函数中访问这个变量,需不需要添加额外的声明,如果需要的话,应该添加什么样的声明?

答:因为是同一个源文件。int x;

  1. 假定问题17中的声明包含了关键字static。你的答案会不会有所变化?

答:不会

  1. 假定文件a.c的开始部分有下面这样的声明:int x;
    如果你希望从不同的源文件的函数中访问这个变量,需不需要添加额外的声明,如果需要的话,应该添加什么样的声明?

答:不同源文件,extern int x;

  1. 假定问题19的声明包含了关键字static。你的答案会不会有所变化?

答:是的,x变量就不能被其它文件访问。

  1. 假定一个函数包含了一个自动变量,这个函数在同一行中被调用了两次。试问,在函数第二次调用开始时该变量的值和函数第一次调用即将结束时的值有无可能相同?

答:有可能相同

  1. 当下面的声明出现于某个代码块内部和出现于任何代码块外部时,它们在行为上有何不同?
    int a = 5

答:代码块外部的变量存储于静态内存中,在程序运行之前创建,在程序整个执行期间始终存在。它始终保持原先的值,除非给它一个不同的值或者程序结束。
代码块内部的变量存储与堆栈中,在程序执行到声明时,才被创建,当程序的执行流离开该代码就会自行销毁。如果代码块被数次执行,这个变量就会被重新创建。

  1. 假定你想在同一个源文件中编写两个函数x和y,需要使用下面的变量:
    在这里插入图片描述你应该怎么样编写这些变量?应该在什么地方编写?注意:所有初始化必须在声明中完成,而不是通过函数中的任何可执行语句完成。
感觉这题有点问题哈~~~
static char b = '2';
int y(){
};
static int a = 1;
int x(){
	int c = 3;
	static float d = 4;
};
  1. 略。
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值