一道C面试题:不改变main函数前提下改变输出结果

来源:互联网 发布:linux中echo n 编辑:程序博客网 时间:2024/04/28 09:50
同学面试回来问我一道面试题:


编程,不改变main函数中的一行代码,不做任何改变,改变输出。
由原来的输出:
World
变为输出:
Hello  world  over
也就是原始输出的前后都增加了。


原函数如下:
#include<iostream>
using namespace std;


int  main()
{
    cout<<"world"<<endl;
return 1;
}


思考了一下主要想出4个办法:
1. 用define宏定义,文本替换实现。
2. 用全局对象,通过其构造函数和析构函数实现
3. 重写输出运算符>>
4. 重写系统的启动函数和退出函数


后来上机验证了一下,只有前两个调通了,后面也没搞懂怎么不行~~~~(>_<)~~~~ 。


1. define实现
#define cout cout<<"hello\n"
#define endl "\nover!\n"
完整代码如下:
// hello world.cpp : 定义控制台应用程序的入口点。
#include<iostream>
using namespace std;


#define cout cout<<"hello\n"
#define endl "\nover!\n"


int  main()
{


    cout<<"world"<<endl;
return 1;
}
2. 总感觉第一种方法有点投机取巧的意思,面试官考察的知识点应该不在这吧,所以又有了第二种方法。
通过定义一个类,然后用这个类定义一个全局对象,类的构造函数一定在main之前调用,而析构函数一定在main执行完退出时调用。 
函数实现:
// hello world.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;


class a{
public:
a(){
cout<<"hello\n";
}
public:
~a()
{
cout<<"\n over \n";
}
};
a A;


int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"world"<<endl;
return 1;
}
本来我平时习惯用VC6.0的,前一个程序是6.0环境下的,结果第二种方法6.0下总是输出不正确,最后析构函数不执行,所以换到Visual stdio2010下就正常了。
感觉这种方法应该是这道题的本意吧。考察全局变量的生命周期。


3. 第三种方法理论上是行得通的,程序编译通过了,可就是没搞懂为什么不出结果,怪哉,留给有兴趣的同学共同探讨吧。
代码如下:
ostream& operator<<(ostream &o,string str)
{
o<<str<<"hi"<<endl;
return o;
}
4. 第四种方法,是我拿到题目的第一反应,我表示是把简单的问题复杂化了。


希望共同探讨啊
原创粉丝点击