C/C++校招笔试面试经典题目总结二

接着昨天的总结继续。。。

题目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)

题目13:下列代码段输出cout<<sizeof(c)<<endl;的结果是?

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的基本数据类型(

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值