6个变态的C语言编写“hello world”程序的解释(1)

       下面这个程序片段主要完成以下两件事情:

         1)完成输出Hello World。

          2)混乱C语言代码。

  1. #define _________ }  
  2. #define ________ putchar  
  3. #define _______ main  
  4. #define _(a) ________(a);  
  5. #define ______ _______(){  
  6. #define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)  
  7. #define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)  
  8. #define ____ _(0x72)_(0x6C)_(0x64)_(0x21)  
  9. #define _____ __ ___ ____ _________  
  10. #include<stdio.h>  
  11. _____  
        这里面主要涉及到的就是#define宏定义的使用技巧及ASCII码字符集。

        首先,让我们来熟悉回顾下#define的具体用法:

        宏定义的格式:#define  宏名  宏定义字符串

         注意:宏定义只在编译预处理中起作用,不是真正的C语句行尾无需分号;宏名与宏定义字符串之间采用空格分隔,所以宏定义字符串中间不能有空格。宏替换对引号内的宏名无效。

         以下是用法:

  1. "定义符号常量"  
  2. #define PI 3.1415926  
  3.   
  4. "给程序书写带来方便"  
  5. #define  LONG_STRING "it is really a long long\  
  6. long long string"  
  7. printf(LONG_STRING);  
  8.   
  9. "嵌套的宏定义"  
  10. #define PI 3.14  
  11. #define S PI*r*r  
  12.   
  13. "宏定义作用范围"  
  14. 宏定义可以写在程序中任何位置,作用范围从定义处到文件爱结尾。  
  15. 可通过#undef强制指定结束范围   
  16.   
  17. "带参数的宏定义"   
  18. #define SQR(x) x*x  
  19. #define SQR(x) (x)*(x)  
  20. //执行过程,在程序编译时现用实参替换形参,然后用宏定义字符串完成整个替换。  
  21. //若SQR(X)是一般声明的函数,对他的处理要等到程序执行时才进行。   
  22. //注意两者的区别,宏定义只是简单的字符替换。当x=a+b时,两者分别表示  
  23. //a+b*a+b和(a+b)*(a+b)  
  24.   
  25. "宏定义指针类型时的坑"  
  26. #define Pointer int *  
  27. Pointer a,b;   
  28. //始终牢记#define只是简单的字符替换,这里的b是int型 。正确方法如下:  
  29. typedef int * Pointer;//不要漏掉分号   
  30. Pointer a,b;   
  31.   
  32. "编译预处理"  
  33. #define FLAG  
  34. #if FLAG  
  35.     statement 1  
  36. #else  
  37.     statement 2  
  38. #endif  
  39. //statement 1与statement 2只有一段会被编译到源程序里面  
  40.   
  41. "防止头文件的重复包含"  
  42. #ifndef FUNCTION_H_INCLUDED  
  43. #define FUNCTION_H_INCLUDED  
  44. #endif // FUNCTION_H_INCLUDED  

字符与ASCII码的对应关系

  1. 0x48='H'    0x65='e'    0x6c='l'    0x6f='o'    0x2c=','    0x20=' '   0x77=''w   0x72='r'    0x64='d'   0x21='!'  

到这里,我们再回头看看如何理解一开始的那个BT的Hello World程序。


        如图所示,我已经不同类型的下划线分别做了不同的记号表示,然后我们可以开始简单的字符替换了:

  由行号11可得到行号9的宏定义字符串;蓝色可替换成行号6的宏定义字符串,红色可替换为行号7的宏定义字符串,黄色可定义成行号8的宏定义字符串,下划线1替换为}

  1. ______ _(0x48)_(0x65)_(0x6C)_(0x6C) _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F) _(0x72)_(0x6C)_(0x64)_(0x21)}      

按照如上所示方法,全部替换后程序转换为

  1. main(){putchar('H');putchar('e');putchar('l');putchar('l');putchar('o');putchar(',');putchar(' ');putchar('w');putchar('o');putchar('r');putchar('l');putchar('d');putchar('!');}  

看似非常混乱的C代码翻译之后还是很直观的,虽然只是很简单的替换,但我觉得这样的混乱真的让C变得挺有意思的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值