接着昨天的总结继续。。。
题目11:#define DOUBLE(x) x+x ,i = 5*DOUBLE(5)。 i 是多少?
解答:
这个题目和题目6是同一个题型,这里并不会出现i=5*(5+5)=50的结果,因为题目只是使用了x+x来替代DOUBLE(x),注意x+x并没有使用括弧,所以结果应该为:i=5*x+x=5*5+5=30。所以在写宏定义的时候一定要谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。
题目12:在不用第三方参数的情况下,交换两个参数的值。
解答:
很有意思的一道题目,有三种方法:
方法一:
a=a+b;
b=a-b;
a=a-b;
方法二:
i^=j;
j^=i;
i^=j;
方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)
union a {
int a_int1;
double a_double;
int a_int2;
};
typedef struct
{
a a1;
char y;
} b;
class c
{
double c_double;
b b1;
a a2;
};
解答:
考查对sizeof的理解,和题目8是同一题型。一些基本数据类型的sizeof这里就不在介绍了,下面重点讲下结构体的sizeof:
先看一个例子:
struct S1
{
char c;
int i;
};
问sizeof(s1)等于多少?聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗?你在你机器上试过了吗?也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。
我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:
S1 s1 = { 'a', 0xFFFFFFFF };
定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么?以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:
0012FF78: 61 CC CC CC FF FF FF FF发现了什么?怎么中间夹杂了3个字节的CC?看看MSDN上的说明:
When applied to a structure type or variable,sizeofreturns the actual size, which may include padding bytes insertedforalignment.
原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。
为什么需要字节对齐,计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(