有趣的“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的程序代码:

#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环境下是可以实现要求的。

在这里插入图片描述

代码如下:

int printf(const char *format,...);
 
int main()
{
    return printf("hello, world");
}

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

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

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;

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

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值