C Primer Plus(第6版)第十六章复习题答案

16.7

a.dist = 5280 * miles; 有效
b.plort = 4 * 4 + 4; 有效
c. nex = = 6; 无效
d.y = y + 5; 有效
#define  NEW(X) ((X) + 5)

#define MIN(X, Y) ((X) > (Y) ? (X) : (Y))
#define EVEN_GT(X, Y) ((X) > (Y) && (X) % 2 == 0 ? 1 : 0)
#define PR(X, Y) printf(#X "is %d and " #Y "is %d \n", X, Y)
a. #define QUARTERCENTURY 25
b. #define SPACE ' '
c. #define PS()
d. #define BIG(X) ((X) + 3)
e. #define SUMSQ(X, Y) ((X) * (X) + (Y) * (Y))
#define P(X) printf("name: " #X ";value : %d ; address : %p \n", X, &X)

使用条件编译指令。一种方法是使用#ifndef:
#define _SKIP_ // 如果不需要跳过代码,则删除这条指令
#ifndef _SKIP_
/*需要跳过的代码*/
#endif
#ifdef PR_DATE
	printf("Date = %s \n", __DATE__);
#endif
第一个版本返回x*x,这只是返回了double类型的值。

第二个版本返回(int) (x*x),计算结果被截断后返回。
但是由于该函数的返回类型是double,int类型的值被升级为double类型的值,
所以1.69将先被转换成1,然后被转换成1.00

第三个版本返回int (x * x + 0.5)
加上0.5可以让函数把结果四舍五入至与原值最接近的值,而不是简单的截断。
这是一种方案:
#define BOOL(X) _Generic((X), _Bool : "boolean", default : "not boolean")

应该把argv参数声明为char * argv[]类型。
命令行参数被储存为字符串,所以程序应该先把argv[1]种的字符串转换成double类型的值。
例如,用stdlib.h库中的atof()函数。
程序使用了sqrt()函数,所以应该包含math.h头文件。
程序再求平方根之前应该排除参数为负的情况(检查参数是否大于或等于0)。
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;
}
a.函数调用应该类似:
memcpy(data1, data2, 100 * sizeof(double));

b.函数调用应该类似:
memcpy(data1, data2 + 200, 100 * sizeof(double));

你可能感兴趣的:(C,Primer,Plus答案)