41-复习题
16.17 复习题
1.下面的几组代码由一个或多个宏组成,其后是使用宏的源代码。在每种情况下代码的结果是什么?这些代码是否是有效代码?(假设其中的变量已声明)
a.
#define FPM 5280 /*每英里的英尺数*/
dist = FPM * miles;
b.
#define FEET 4
#define POD FEET + FEET
plort = FEET * POD;
c.
#define SIX = 6;
nex = SIX;
d.
#define NEW(X) X + 5
y = NEW(y);
berg = NEW(berg) * lob;
est = NEW(berg) / NEW(y);
nilp = lob * NEW(-berg);
2.修改复习题1中 d 部分的定义,使其更可靠。
3.定义一个宏函数,返回两值中的较小值。
4.定义 EVEN_GT(X, Y) 宏,如果 X 为偶数且大于 Y ,该宏返回 1 。
5.定义一个宏函数,打印两个表达式及其值。例如,若参数为 3+4 和 4*12 ,则打印:
3+4 is 7 and 4*12 is 48
6.创建 #define 指令完成下面的任务。
a.创建一个值为25的命名常量。
b. SPACE 表示空格字符。
c. PS() 代表打印空格字符。
d. BIG(X) 代表 X 的值加 3 。
e. SUMSQ(X, Y) 代表 X 和 Y 的平方和。
7.定义一个宏,以下面的格式打印名称、值和int类型变量的地址:
name: fop; value: 23; address: ff464016
8.假设在测试程序时要暂时跳过一块代码,如何在不移除这块代码的前提下完成这项任务?
9.编写一段代码,如果定义了 PR_DATE 宏,则打印预处理的日期。
10.内联函数部分讨论了3种不同版本的 square() 函数。从行为方面看,这3种版本的函数有何不同?
11.创建一个使用泛型选择表达式的宏,如果宏参数是 _Bool 类型,对 "boolean" 求值,否则对 "not boolean" 求值。
12.下面的程序有什么错误?
#include <stdio.h>
int main(int argc, char argv[])
{
printf("The square root of %f is %f\n", argv[1],sqrt(argv[1]) );
}
13.假设 scores 是内含 1000 个 int 类型元素的数组,要按降序排序该数组中的值。假设你使用 qsort() 和 comp() 比较函数。
a.如何正确调用 qsort() ?
b.如何正确定义 comp() ?
14.假设 data1 是内含100个 double 类型元素的数组, data2 是内含300个 double 类型元素的数组。
a.编写 memcpy() 的函数调用,把 data2 中的前 100 个元素拷贝到 data1 中。
b.编写 memcpy() 的函数调用,把 data2 中的后 100 个元素拷贝到 data1 中。