首页 > 代码库 > 第二章 接口与实现
第二章 接口与实现
2 Exercises
2.1 A preprocessor macro and conditional compilation directives, such as #if, could have been used to specify how division
truncates in Arith_div and Arith_mod. Explain why the explicit test -13/5 == -2 is a better way to implement this test.
如果使用预处理指令和条件编译指令去指定Arith_div和Arith_mod如何取整的话是可以的,
但这些都是与运行时环境相关的,需要针对不同运行环境编写不同实现。
而像 -13/5 == 2这样去测试的话,无论运行时环境如何,都可以在运行时由当前环境去判断应该如何取整。
2.2 The -13/5 == -2 test used in Arith_div and Arith_mod works as long as the compiler used to compile arith.c does arithmetic
thesame way as Arith_div and Arith_mod do when they are called. This condition might not hold, for example, if arith.c were compiledby
a cross-compiler that runs on machine X and generates code for machine Y. Without using conditional compilation directives,
fix arith.c so that such cross compilations produce code that is guaranteed to work.
这题目感觉本身有点问题 当 -13/5 == 2 不成立时自然会执行else分支,返回的结果应该是一样的。
2.3 Like all ADTs in this book, the Stack interface omits the specification “it is an unchecked runtime error to pass a foreign
Stack_T to any routine in this interface.” A foreign Stack_T is one that wasnot manufactured by Stack_new. Revise stack.c
so that it can check for some occurrences of this error. One approach, for example, is to add a field to the Stack_T
structure that holds a bitpatternunique to Stack_Ts returned by Stack_new.
1 struct T {2 int count;3 struct elem {4 void *x;5 struct elem *link;6 } *head;7 int identifer;8 };
2.4 It’s often possible to detect certain invalid pointers. For example, a nonnull pointer is invalid if it specifies an address outside
the client’s address space, and pointers are often subject to alignment restrictions; for example, on some systems a pointer to a
double must be a multiple of eight. Devise a system-specific macro isBadPtr(p) that is one when p is an invalid pointer so that
occurrences of assert(ptr) can be replaced with assertions like assert(!isBadPtr(ptr)).
/* 判断是否在本程序空间,这个和系统有关吧,不懂实现 */
#define isBadPtr(p) (p && (p%8 == 0))
2.5 There are many viable interfaces for stacks. Design and implement some alternatives to the Stack interface. For example,
one alter native is to specify a maximum size as an argument to Stack_new.
Stack_new 增加指定最大分配空间接口,主要难点是在入栈时对当前空间大小的判断。
第二章 接口与实现