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
中。