当前位置:嗨网首页>书籍在线阅读

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)

(因为该宏中没有运算符(如,乘法)作用于 XY ,所以不需要使用圆括号。)

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) ,计算结果被截断后返回。但是,由于该函数的返回类型是 doubleint 类型的值将被升级为 double 类型的值,所以 1.69 将先被转换成 1 ,然后被转换成 1.00 。第 3 个版本返回 (int)(x * x+0.5) 。加上 0.5 可以让函数把结果四舍五入至与原值最接近的值,而不是简单地截断。所以, 1.69+0.52.19 ,然后被截断为 2 ,然后被转换成 2.00 ;而 1.44+0.51.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));