0%

有趣的"Hello World"

 前段时间在逛知乎的时候,偶然发现一道有意思的编程题
知乎
参考链接: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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
void main()
{
if(putchar(72)){
}
if(putchar(101)){
}
if(putchar(108)){
}
if(putchar(108)){
}
if(putchar(111)){
}
if(putchar(32)){
}
if(putchar(87)){
}
if(putchar(111)){
}
if(putchar(114)){
}
if(putchar(108)){
}
if(putchar(100)){
}
}

 这里需要说明的一点是,在最新的c标准中,已经不允许main函数的类型为void。

3.不用# 输出Hello,World!

 这道题不得不感叹自己所学的知识的贫瘠,一直想着怎么在windows编译环境下怎么达到这个条件,看了原帖的回复,说是要重新定义printf()函数,然后在dev里试了试重新定义了一下printf函数,发现报错没有定义printf()这个函数。
 后来才发现原来重新定义printf()函数在linux环境下是可以实现要求的。

代码如下:

1
2
3
4
5
6
int printf(const char *format,...);

int main()
{
return printf("hello, world");
}

4.不用括号输出Hello,World!(包括各种括号(),<>,{},[]都不能用 )

 第四题出题人并不是为了输出”Hello World”出的题,本意在了解ELF文件格式。
附上知乎大佬的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
const char main = 0x55, main1 = 0x48, main2 = 0x89, main3 = 0xe5, main4 = 0xb8,
main5 = 0x01, main6 = 0x00, main7 = 0x00, main8 = 0x00, main9 = 0xbb,
main10 = 0x01, main11 = 0x00, main12 = 0x00, main13 = 0x00,
main14 = 0x67, main15 = 0x8d, main16 = 0x35, main17 = 0x10,
main18 = 0x00, main19 = 0x00, main20 = 0x00, main21 = 0xba,
main22 = 0x0d, main23 = 0x00, main24 = 0x00, main25 = 0x00,
main26 = 0x0f, main27 = 0x05, main28 = 0xb8, main29 = 0x3c,
main30 = 0x00, main31 = 0x00, main32 = 0x00, main33 = 0x31,
main34 = 0xdb, main35 = 0x0f, main36 = 0x05, main37 = 0x48,
main38 = 0x65, main39 = 0x6c, main40 = 0x6c, main41 = 0x6f,
main42 = 0x20, main43 = 0x57, main44 = 0x6f, main45 = 0x72,
main46 = 0x6c, main47 = 0x64, main48 = 0x21, main49 = 0x0a,
main50 = 0x5d;

 一个小彩蛋:
 浏览评论的时候,发现了一条很有意思的评论,知乎还真的是很有趣呢~