sherrylso

C++博客 首页 新随笔 联系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

题目是这样的:
问:不使用任何循环语句,递归,输出打印n条(n>1) "Hello World"。
解这道题目,利用了c++语言一个非常重要的特性:
c++允许定义基于statck数据区的Object。由此,不由想到了Java.
在Java的世界里,所有的类型都是引用(或者称为指针), 对象内存的分配都是通过new从heap上显式的分配,无法在Java里构建基于statck数据区的对象。所以在Java里,这道题目是无解的。
Java之于c++,既是进步,又是倒退。
Java语言本身的确帮助c++程序员做了很多事情,比如GC, 去掉了c++中很多复杂的特性,比如多重继承,运算符重载等。
同时,c++本身的很多优点,也丧失了。 写了c++, 然后再写java,一个明显的感觉是,没法使用java写出像c++一样简洁的程序。
比如, 没有了运算符重载, 你不得不使用equal方法来表达两个对象的相等。
Java不能显式表达RAII概念,你不得不使用hard code的方法Log方法的进入和退出, 如:
func() {
log("enter func");
//do something.
log("exit func");
}

posted on 2009-01-12 22:28 爱上龙卷风 阅读(2799) 评论(23)  编辑 收藏 引用

Feedback

# re: 一道面试题想到的 2009-01-12 23:29 ZhouRui
那么请问解是怎样?元编程吗?  回复  更多评论
  

# re: 一道面试题想到的 2009-01-12 23:39 夜弓
@ZhouRui
构造函数啊~  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 01:15 Bill Gates
这样算是取巧了,因为new一个对象数组,其实编译器也会生成循环调用构造函数的代码  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 11:30 梦在天涯
new 数组这也叫解啊,难道你定义一个一般的变量就不调用构造函数了吗?  回复  更多评论
  

# re: 一道面试题想到的[未登录] 2009-01-13 11:47 cppexplore
我想楼主想表达的意思并不在于该题本身,而是RAII
我随意搜索了一下,有兴趣可以继续看下:http://hi.baidu.com/joel%5Ftan/blog/item/8682fcd8ceefeb3032fa1c3b.html
相信大家不会认为博主的这点“简单”想法不是“nosense”。
  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 12:00 cppexplore
汗,上个评论最后一句多写了一个“不”,博主见谅。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 12:49 陈梓瀚(vczh)
class X
{
public:
X()
{
cout<<"Hello World"<<end;
}
};

int x;
cin>>x;
delete[] new X[x];  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 14:22 紫云追雪
用 goto 语句 算循环吗?
或者,直接用汇编Jmp 算 循环吗?

xxx.h
#define Printf1 printf("Hello World")
#define Printf2 Printf1;Printf1;
#define Printf3 Printf2;Printf1;
#define Printf4 Printf3;Printf1;
......

#define Printf( N ) Printf ## N

硬编码 行不。。
Printf(n);  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 15:45 ss
int printHello(int n)
{
return ( n && printf("hello word\n") && printHello(n - 1) );
}  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 17:10 cppexplore
.................................
真的没人愿意看看RAII???????????????guard的实现、资源的自动管理、资源申请的原子操作????这个题目也只是RAII的一个小小实践
class X{
public:
X(){}
~X(){printf("hello world!\n");}
};
int main()
{
X obj[n];
return 0;
}  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 17:45 ZhouRui
@夜弓
Java不是一样有构造函数。。。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 18:25 星绽紫辉
做这样的题目只是浪费时间,没有任何意义。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 22:11 Chipset
如果一个面试官问我这样的问题,我会认为他弱智,这样的公司我宁愿不去。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-13 23:47 bneliao
从计算理论说,没有递归或循环迭代是不能实现无穷有限数n的。

构造数组不过是用编译器来实现吧了。

不过也提供了一种途径。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-14 09:39 夜弓
@ZhouRui
但是Java不能new 对象数组啊  回复  更多评论
  

# re: 一道面试题想到的 2009-01-14 17:05 ZhouRui
@夜弓
哦,晓得了,谢谢~  回复  更多评论
  

# re: 一道面试题想到的 2009-01-14 22:06 wuchang
递归调用算不算循还?  回复  更多评论
  

# re: 一道面试题想到的 2009-01-15 17:19 abettor
“你不得不使用hard code的方法Log方法的进入和退出”

其实Java有一个相当NB的方式“Log方法的进入和退出”,那就是大名鼎鼎的AOP。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-15 18:26 哈哈董波
模板元被,这么简单。  回复  更多评论
  

# re: 一道面试题想到的 2009-01-17 11:35 tbyxyz
#include <stdio.h>

template<int N>
struct Printer
{
static void Print()
{
printf("Hello World\n");
Printer<N-1>::Print();
}
};

template<>
struct Printer<0>
{
static void Print()
{
}
};

int main()
{
Printer<10>::Print();
}  回复  更多评论
  

# re: 一道面试题想到的 2009-01-19 17:46 giscn
这种题目不好, 用C++不一定要用 meta program,对于新手有误导性,熟练掌握C++最基本的东西是最重要的  回复  更多评论
  

# re: 一道面试题想到的 2011-03-08 10:56 tian Qingfei
应该是用递归:

void f(int i) {
if(i<0) return;
else {
printf("hello world!\n");
return f(--i);
}  回复  更多评论
  

# re: 一道面试题想到的 2011-03-08 11:50 tian Qingfei
这个也行,但比较不常用:
template<int N>
void doSomething() {
cout<<"Hello world!"<<endl;
doSomething<N-1>();
}

template<>
void doSomething<0>() {
return;
}  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理