《程序员面试宝典》—— 第6章 预处理、const与sizeof

6.1宏定义

——6.1.1下列代码将输出什么?

#include <stdio.h>
#define SUB(x,y) x - y
#define ACCESS_EFFORE(element,offset,value) *SUB(&element,offset) = value

int main()
{
	int i;
	int array[10] = { 1,2,3,4,5,6,7,8,9,10 };
	ACCESS_EFFORE(array[5], 4, 6);
	for (i = 0; i < 10; i++) { printf("%d\n", array[i]); };
	//printf("%d\n", *&array[5]);

	return 0;
}

答:可以正确编译,但是运行时会崩溃 这里表示有疑问?
——宏并不是函数,仅仅是机械替换,在这里,宏那句被预处理器替换成了*&array[5]-4=6; 由于减号比赋值运算符的优先级高,因此先处理减号;变成6-4=6;此时编译器就会报错“=左边必须是个左值”
——如果宏定义变成#define SUB(x,y) (x-y) 就会输出“1 6 3 4 5 6 7 8 9 10”
因为此时宏在预处理中是这样的:

*SUB(&array[5]-4) = 6;	//此时先运行括号里的,array[5]的指针-4,指针左移4位
//指向array[1],然后*array[1] = 6; 将6赋值到array[1]中去,故才有上面的输出。

6.1.2 用预处理指令声明一个常数,用以表明一年中有多少秒(忽略闰年)

#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

——此题主要考察宏定义的基本知识(不能以分号结束、括号的使用等)
——预处理器将会为你计算出常数表达式的值,因此,写出你是如何计算的就行,而没必要计算实际的值,会更有意义。
——另外,意识到16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是长整型。
——如果在表达式中用到UL(无符号长整型)就更好了。

6.1.3 写一个标注宏,实现输入两个参数并返回较小的一个

#define MIN(A,B) ((A) <= (B)? (A):(B))

——主要考察宏中小心的将参数用括号括起来。

6.2 const

6.3 sizeof

——unsigned影响的只是最高位bit的意义(正/负),数据的长度是不会改变的。
——自定义类型的sizeof取值等同于它的类型原型。
——对函数使用sizeof,在编译阶段会被函数的返回值所取代
——只要是指针,大小就是4
——数组的大小是各维数的乘积*数组元素的大小
——一个空类所占空间为1,多重继承的空类所占空间还是1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值