三道很经典的面试题目
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中,一个数是可能不等于它自己的!试试看下面的代码输出什么?
上面的代码输出"i!=i",为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN("Not a Number"的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。
在C语言中,要用这个思路则会出错,所以要实现同样的效果就需要借助于异常处理了,代码像下面这样:
2、
不让用循环和if,我们就还有递归噻,嘿嘿!简单递归实现如下:
当然,你还可以有更高级的办法,譬如下面的两个函数回调实现:
经过查阅资料,还有的说Java实现更厉害,介于其多线程的特色,可以来回的沉默和唤醒来达到目的。不过鄙人Java技术实在一般,不会整。。。高手可以指点一二
3、
第三题的难度不小,在main函数执行之前,程序还做了些什么呢?当然,这里不考虑vxWorks系统下的情况,因为它可以单独执行任何一个函数,只要新建一个KDM(Kernel Downloadable Module)工程就可以了(呵呵,最近在弄vxWorks6.8,小卖弄一下,见谅)
这个要搞定,就一定要人为的修改函数的偏移地址了,代码如下:(摘自看雪)
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() { }
相关文章推荐
- 三道很经典的面试题目
- C#,.Net经典面试题目及答案
- 笔试面试经典题目及解答——持续更新中
- 33条C#、.Net经典面试题目及答案
- 2017年最新PHP经典面试题目汇总(上篇)
- asp.net面试中的四十一个经典题目
- 经典面试题目——250M内存处理10G大小的log文件
- C/C++校招笔试面试经典题目总结三
- 微软公司的三道面试题目看了会有意想不到的收获
- 经典面试题目--数组的排序去重
- C#、.Net 经典面试题目及答案
- 经典java面试题目
- 33条C#、.Net经典面试题目及答案
- 微软公司的三道面试题目看了会有意想不到的收获
- 世界五百强企业—经典50道面试题目及应答评点
- Linux驱动经典面试题目
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- 2015年9-10月互联网秋招经典面试题目汇总
- 【面试题目】经典shell面试题整理
- c#经典面试题目及答案