同学面试回来问我一道面试题:
编程,不改变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. 第四种方法,是我拿到题目的第一反应,我表示是把简单的问题复杂化了。
希望共同探讨啊
编程,不改变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. 第四种方法,是我拿到题目的第一反应,我表示是把简单的问题复杂化了。
希望共同探讨啊