前段时间在逛知乎的时候,偶然发现一道有意思的编程题
参考链接:hello world编程题你会吗?
Helllo World算是最简单也最基础的程序了,我们一般在编写c语言代码的时候,输入输出都会很自然地联想到frintf()和scanf(),这几道题非常地有意思,要求跳出常规思维输出’’Hello World’。
1.不用 “ “ 输出Hello,World!
不用” “输出,那么就不能用scanf()这个函数了,那么怎么办呢,想到c语言在处理字符常量的时候是把它当做数字来处理的,所以可以用普通char()函数把”Hello World”的每个字符的Ascii码输出。
这道题如果引伸为不用引号来输出(单引号和双引号都不能使用),其实也是一样的,putchar()函数可以直接用数字作为参数。
2.不用 ; 输出Hello,World!
不用;输出,也就是出代码中不能出现完整的语句,仔细思考下在c语言当中哪些位置可以不用;的,发现if语句刚好满足要求。
附上同时满足条件1和2的程序代码:
1 |
|
这里需要说明的一点是,在最新的c标准中,已经不允许main函数的类型为void。
3.不用# 输出Hello,World!
这道题不得不感叹自己所学的知识的贫瘠,一直想着怎么在windows编译环境下怎么达到这个条件,看了原帖的回复,说是要重新定义printf()函数,然后在dev里试了试重新定义了一下printf函数,发现报错没有定义printf()这个函数。
后来才发现原来重新定义printf()函数在linux环境下是可以实现要求的。
代码如下:
1 | int printf(const char *format,...); |
4.不用括号输出Hello,World!(包括各种括号(),<>,{},[]都不能用 )
第四题出题人并不是为了输出”Hello World”出的题,本意在了解ELF文件格式。
附上知乎大佬的代码:
1 | const char main = 0x55, main1 = 0x48, main2 = 0x89, main3 = 0xe5, main4 = 0xb8, |
一个小彩蛋:
浏览评论的时候,发现了一条很有意思的评论,知乎还真的是很有趣呢~