17-第16章复习题答案
A.16 第16章复习题答案
1.a. dist = 5280 * miles; 有效。
b. plort = 4 4 + 4; 有效。但是如果用户需要的是 4 (4 + 4) ,则应该使用 #define POD (FEET + FEET) 。
c. nex = = 6;; 无效(如果两个等号之间没有空格,则有效,但是没有意义)。显然,用户忘记了在编写预处理器代码时不用加 = 。
d. y = y + 5; 有效。 berg = berg + 5 * lob; 有效,但是可能得不到想要的结果。 est = berg + 5/y + 5; 有效,但是可能得不到想要的结果。
2. #define NEW(X) ((X) + 5)
3. #define MIN(X,Y) ( (X) < (Y) ? (X) : (Y) )
4. #define EVEN_GT(X,Y) ( (X) > (Y) && (X) % 2 == 0 ? 1 : 0 )
5. #define PR(X,Y) printf(#X " is %d and " #Y " is %d\n", X,Y)
(因为该宏中没有运算符(如,乘法)作用于 X 和 Y ,所以不需要使用圆括号。)
6.a. #define QUARTERCENTURY 25
b. #define SPACE ' '
c. #define PS() putchar(' ') 或 #define PS() putchar(SPACE)
d. #define BIG(X) ((X) + 3)
e. #define SUMSQ(X,Y) ((X) (X) + (Y) (Y))
7.试试这样: #define P(X) printf("name: "#X"; value: %d; address: %p\n", X, &X)
(如果你的实现无法识别地址专用的 %p 转换说明,可以用 %u 或 %lu 代替。)
8.使用条件编译指令。一种方法是使用 #ifndef :
#define _SKIP_ /* 如果不需要跳过代码,则删除这条指令 */
#ifndef _SKIP_
/* 需要跳过的代码 */
#endif
9.
#ifdef PR_DATE
printf("Date = %s\n", _ _DATE_ _);
#endif
10.第 1 个版本返回 x x ,这只是返回了 square() 的 double 类型值。例如, square(1.3) 会返回 1.69 。第 2 个版本返回 (int)(x x) ,计算结果被截断后返回。但是,由于该函数的返回类型是 double , int 类型的值将被升级为 double 类型的值,所以 1.69 将先被转换成 1 ,然后被转换成 1.00 。第 3 个版本返回 (int)(x * x+0.5) 。加上 0.5 可以让函数把结果四舍五入至与原值最接近的值,而不是简单地截断。所以, 1.69+0.5 得 2.19 ,然后被截断为 2 ,然后被转换成 2.00 ;而 1.44+0.5 得 1.94 ,被截断为 1 ,然后被转换成 1.00 。
11.这是一种方案 : #define BOOL(X) _Generic((X), _Bool : "boolean", default : "not boolean")
12.应该把 argv 参数声明为 char * argv[] 类型。命令行参数被存储为字符串,所以该程序应该先把 argv[1] 中的字符串转换成 double 类型的值。例如,用 stdlib.h 库中的 atof() 函数。程序中使用了 sqrt() 函数,所以应包含 math.h 头文件。程序在求平方根之前应排除参数为负的情况(检查参数是否大于或等于 0 )。
13.a. qsort( (void * )scores, (size_t) 1000, sizeof (double), comp);
b.下面是一个比较使用的比较函数:
int comp(const void * p1, const void * p2)
{
/* 要用指向int的指针来访问值 */
/* 在C中是否进行强制类型转换都可以,在C++中必须进行强制类型转换 */
const int * a1 = (const int *) p1; const int * a2 = (const int *)
p2;
if (*a1 > *a2)
return -1;
else if (*a1 == *a2)
return 0;
else
return 1;
}
14.a.函数调用应该类似: memcpy(data1, data2, 100 * sizeof(double));
b.函数调用应该类似: memcpy(data1, data2 + 200 , 100 * sizeof(double));