C/C++实际遇到的面试题

本人自学C++,现要转行到IT开发行业,最近面试遇到的一些面试题列在下边,附答案及剖析。不分先后。

1,判断下边这段代码输出结果是什么?

#include <stdio.h>
 
void main()
{
	unsigned int a=6;
	int b=-20;
	if((a+b)>6)
		printf(">6");
	else
		printf("<=6");

控制台执行结果为:

>6

原因剖析:
这道题考察C的自动类型转换规则:
自动转换顺序
1、若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。

  • a、若两种类型的字节数不同,转换成字节数高的类型
  • b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型

3、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
4、char型和short型参与运算时,必须先转换成int型。
5、在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入。

2,定义MIN宏函数,传入两个参数,使其结果为两者中较小的一个。

#define MIN(a,b) (((a)<(b))?(a):(b))
//注意,这里的括号不能省,比如说万一要运算temp = 3*MIN(x,y);展开后会是怎样?
//另外,这样写会有副作用,比如说least = MIN(x,y[j++]);结果如何?

3,用宏定义一年的秒数。

#define SEC_PER_YEAR (365*24*60*60UL)
//错误方法:#define SEC_PER_YEAR(365*24*60*60) 宏定义默认int类型,超过类型存储范围了
//#define SEC_PER_YEAR(365*24*60*60)UL 实际测试VS/GCC编译不通过

4,memcpy与memmove有什么区别。请手动写出这两个函数的实现。

  • memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
  • memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
    代码实现:
//memcpy实现:
void* mymemcpy(void* dest, const void* src, size_t count)
{
	assert(dest != NULL||src != NULL);
	char *tmp = (char*)dest;
	char *p = (char*)src;
	
	while(count--)
	{
		*tmp++ = *p++;
	}
	return dest;
}

你有没有优化这个memcpy方法的方案?
看大神讨论: 如何对memcpy/memset优化

//memmove实现:
void* mymemmove(void* dest, const void* src,size_t count)
{
assert(dest != NULL||src != NULL);

if(dest<src)
{
	//mymemcpy(dest, src, count);
	char *p = (char*)dest;
	char *q = (char*)src;
	while(count--)
	{
		*p++ = *q++;
	}
}
else
{
	char* p = (char*)dest + count;
	char* q = (char*)src + count;
	while(count--)
	{
		*p-- = *q--;	
	}
}
return dest;
}

5,假设有一个整数a,请写两段代码,第一段代码让a的第3位置为1,第二段代码让a的第3位清零。

a |= (1<<3);	//bit3置为1
a &= ~(1<<3);	//bit3置为0
//a &= 0xFFFFFFF7;这种将bit3置为0的写法在某些机器上可能会得到错误结果。

剖析:
这道题考察是数据的位级的表示与运算。注意,我们实现题目要求的时候不要假设a的位数,因为不同机器的int位数不一定一样,需要考虑到代码的可移植性。

6,评价下面的代码片断:

unsigned int zero = 0;

unsigned int compzero = 0xFFFF;

/*1's complement of zero */

对于一个 int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:

unsigned int compzero = ~0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值