IOCCC 1987 最佳单行代码解读

/* ioccc.c */

/* IOCCC best one-liner winner 1987 by David Korn ---

main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}

from <http://www.ioccc.org/years.html#1987>
*/

/* A detailed set of samples to show how this works
   by David Ireland, copyright (C) 2002.

   Modified by William Cheung
     for GCC Version 4.8.3 on CentOS 7 (x86_64)
   See
       http://www.di-mgt.com.au/src/korn_ioccc.txt
     for original code
*/

#include <stdio.h>

int main()
{

    // int unix;
    // We do not need to declare ‘unix‘, or we will get an error:
    //   expected identifier or ‘(’ before numeric constant
    // because unix is a predefined macro that expands to 1 (only on
    // unix-like systems perhaps) 

    printf("unix=%d\n", unix); /* =1 */    

    /* This prints the string "un",
       i.e. "fun" starting at offset [1] */
    printf("%s\n","fun"+1);

    /* This prints 97 = the int value of the 2nd char ‘a‘ */
    printf("%d\n", "have"[1]);

    /* just like this */
    printf("%d\n", ‘a‘);

    /* ditto because x[1] = 1[x] */
    printf("%d\n", (1)["have"]);

    /* 97 - 96 = 0x61 - 0x60 = 1 */
    printf("%d\n", (1)["have"] - 0x60);

    /* So this is the same as "fun" + 1, printing "un" */
    printf("%s\n", "fun" + ((1)["have"] - 0x60));

    /* Rearrange and use unix variable instead of 1 */
    printf("%s\n", (unix)["have"]+"fun"-0x60);

    /* ...thus we have the first argument in the printf call. */

    /* Both these print the string "bcde", ignoring the ‘a‘ */
    printf("%s\n", "abcde" + 1);
    printf("%s\n", &"abcde"[1]);

    /* so does this */
    printf("%s\n", &(1)["abcde"]);

    /* and so does this (NB [] binds closer than &) */
    printf("%s\n", &unix["abcde"]);

    /* This prints "%six" + newline */
    printf("%s", &"?%six\n"[1]);

    /* So does this: note that
       \012 = 0x0a = \n,
       the first \021 char is ignored,
       and the \0 is superfluous, probably just for symmetry */
    printf("%s", &"\021%six\012\0"[1]);

    /* and so does this */
    printf("%s", &unix["\021%six\012\0"]);

    /* Using this as a format string, we can print "ABix" */
    printf(&unix["\021%six\012\0"], "AB");

    /* just like this does */
    printf("%six\n", "AB");

    /* So, we can print "unix" like this */
    printf("%six\n", (unix)["have"]+"fun"-0x60);

    /* or, finally, like this */
    printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);

    return 0;
}
时间: 2024-11-08 08:24:09

IOCCC 1987 最佳单行代码解读的相关文章

【dlib代码解读】人脸检测器的训练【转】

转自:http://blog.csdn.net/elaine_bao/article/details/53046542 版权声明:本文为博主原创文章,转载请注明. 目录(?)[-] 综述 代码解读 step by step 1 预处理阶段 11 载入训练集测试集 12 图片上采样 13 镜像图片 2 训练阶段 21 定义scanner用于扫描图片并提取特征 22 设置scanner扫描窗口大小 23 定义trainer用于训练人脸检测器 24 训练生成人脸检测器 25 测试 3 tips 31

Jsoup代码解读之六-防御XSS攻击

Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入中嵌入一段恶意脚本,对输出时的DOM结构进行修改,从而达到执行这段脚本的目的.对于纯文本输入,过滤/转义HTML特殊字符<,>,",'是行之有效的办法,但是如果本身用户输入的就是一段HTML文本(例如博客文章),这种方式就不太有效了.这个时候,就是Jsoup大显身手的时候了. 在前面,我

Jsoup代码解读之五-实现一个CSS Selector

Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张street fighter的图,希望以后webmagic也能挑战Jsoup! select机制 Jsoup的select包里,类结构如下: 在最开始介绍Jsoup的时候,就已经说过NodeVisitor和Selector了.Selector是select部分的对外facade,而NodeVisito

Jsoup代码解读之一-概述

Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学学好东西吧! Jsoup是Java世界用作html解析和过滤的不二之选.支持将html解析为DOM树.支持CSS Selector形式选择.支持html过滤,本身还附带了一个Http下载器.从今天开始会写一个Jsoup源码解读系列,比起之前的博客,尽量会写的详尽一些. 概述 Jsoup的代码相当简洁

Jsoup代码解读之四-parser

Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好在HTML语法不复杂,解析只是到DOM树为止,所以作为编译器入门倒是挺合适的.这一块不要指望囫囵吞枣,我们还是泡一杯咖啡,细细品味其中的奥妙吧. 基础知识 编译器 将计算机语言转化为另一种计算机语言(通常是更底层的语言,例如机器码.汇编.或者JVM字节码)的过程就叫做编译(compile).编译器(

Jsoup代码解读之三-Document的输出

Jsoup代码解读之三-Document的输出 Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前,我们不妨先想想,“tidy HTML"到底包括哪些东西: 换行,块级标签习惯上都会独占一行 缩进,根据HTML标签嵌套层数,行首缩进会不同 严格的标签闭合,如果是可以自闭合的标签并且没有内容,则进行自闭合 HTML实体的转义 这里要补充一下HTML标签的知识.HTML Tag可以分为block和inl

Jsoup代码解读之二-DOM相关对象

Jsoup代码解读之二-DOM相关对象 之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多.这篇文章会说明Jsoup的DOM结构,DOM的遍历方式.在下一篇文章,我会并结合这两个基础,分析一下Jsoup的HTML输出功能. DOM结构相关类 我们先来看看nodes包的类图: 这里可以看到,核心无疑是Node类. Node类是一个抽象类,它代表DOM树中的一个节点,它包含: 父节点parent

Jeecg 查询条件拼装-代码解读

许久没有闲下来了,今天不想再写代码了,说说查询条件组装的,虽然基本上是自己写的,但是能写出来不一定可以说出来 ,算是为过两天的讲课做做准备吧. 这个是基于CriteriaQuery 的,而CriteriaQuery又是基于DetachedCriteria这个大家自己看了 写这个的时候,想了挺久,就是想找可以可以扩展的查询拼装,后来定义了这个接口             为每种类型做不同的实现,这个可以为以后类型扩充做准备 判断类型就是依据字段的类型,然后选择类型进行调用,现在实现了 基本上都是基

Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接收.消息处理器的注册与调用以及设置消息处理的回调. 就像项目的名称一样,它是连接UIWebView和Javascript的bridge.在加入这个项目之后,他们之间的交互处理方式变得很友好. 在native code中跟UIWebView中的js交互的时候,像下面这样: [cpp] view pla