一道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. 第四种方法,是我拿到题目的第一反应,我表示是把简单的问题复杂化了。
希望共同探讨啊
编程,不改变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. 第四种方法,是我拿到题目的第一反应,我表示是把简单的问题复杂化了。
希望共同探讨啊
- 一道C面试题:不改变main函数前提下改变输出结果
- c++面试题:在不改变任何代码的情况下 输出hello world!
- 在不改变基类头文件的前提下,使用基类成员函数
- c语言面试题---main函数
- C语言的一道面试题结果(44)
- 如何在数据库中不改变表结构的前提下,新添一个属性?
- 一道c面试题
- 一道C面试题。
- 一道c面试题
- 一道C语言面试题
- 一道C的面试题
- 一道C语言面试题
- 一道C语言面试题
- linux下 C编程改变输出字体颜色
- linux下 C编程改变输出字体颜色
- linux下 C编程改变输出字体颜色
- linux下 C编程改变输出字体颜色
- 如何在子函数中改变main函数中的变量的值——阿里巴巴一面试题
- 用行指针为函数形参来实现对该二维数组求最大值
- NSGA 2 学习笔记 -- 快速排序
- Struts2中转换Date类型的问题
- 也谈字节对齐带来效率的差异
- 最长平台问题------2012年12月24日
- 一道C面试题:不改变main函数前提下改变输出结果
- TabRadioDemo实现tabhost与RadioBox的结合
- Freemarker常用技巧
- C++引用
- 【数据库编程标准规范系列】之第三章:命名约定
- 如何自我介绍
- poj 1129
- activeMQ jms 简单实现
- windows下的jboss与mysql的连接