您的位置:首页 > 职场人生

三道很经典的面试题目

2011-05-24 21:07 197 查看
1、定义一个变量i,使得循环
while(i==i){
}结束。

2、在不用循环和if语句的情况下,输出1到1000的所有整数。

3、在下面代码*号处加一段代码,使程序显示出"hello,world".
#include "stdio.h"
void print()
{
*
}
void main()
{
}
这三道题,咋的一看,貌似不难,都是简单的C应用,但是经得起揣摩啊!!
送上解题思路如下:

1、
可以让i!=i吗?
这个问题在C语言中好像不行,但是在Java中,一个数是可能不等于它自己的!试试看下面的代码输出什么?
double i=0.0/0.0;

if(i==i){

System.out.println("i==i");

}else{

System.out.println("i!=i");

}

上面的代码输出"i!=i",为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。
在C语言中,要用这个思路则会出错,所以要实现同样的效果就需要借助于异常处理了,代码像下面这样:
int a;

int b = 0.0;

try

{

a = 3/b;  //此处不能直接除0.0,否则会报错。

if (a == a)

{

printf("a==a");

}

}

catch (...)

{

printf("a!=a");

}


2、
不让用循环和if,我们就还有递归噻,嘿嘿!简单递归实现如下:
int Print(int num)

{

int a = num > 1?Print(num-1)+1:1;

printf("%d ",a);

return a;

}

void main()

{

Print(1000);

}

当然,你还可以有更高级的办法,譬如下面的两个函数回调实现:
typedef struct LNum

{

static int a;

LNum()

{

printf("%d/n",LNum::a);

a++;

}

}Num;

int Num::a = 1;

void main()

{

Num p[1000];

}

经过查阅资料,还有的说Java实现更厉害,介于其多线程的特色,可以来回的沉默和唤醒来达到目的。不过鄙人Java技术实在一般,不会整。。。高手可以指点一二

3、
第三题的难度不小,在main函数执行之前,程序还做了些什么呢?当然,这里不考虑vxWorks系统下的情况,因为它可以单独执行任何一个函数,只要新建一个KDM(Kernel Downloadable Module)工程就可以了(呵呵,最近在弄vxWorks6.8,小卖弄一下,见谅)
这个要搞定,就一定要人为的修改函数的偏移地址了,代码如下:(摘自看雪)
#include "stdio.h"

void print()

{

#pragma comment(linker, "/entry:print")

#pragma comment(linker, "/SECTION:.text,REW" )

int mainCRTStartup();

void main();

__asm

{

MOV   EAX,  OFFSET main

MOV   BYTE PTR[EAX], 0xB8  //MOV  EAX, 0x

MOV   DWORD PTR[EAX+1], OFFSET SHOWSTRING

MOV   WORD PTR[EAX+5], 0xE0FF // JMP  EAX

}

mainCRTStartup();

SHOWSTRING:

printf ("Hello world!/n");

getchar();

}

void main()

{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: