1987年C语言乱码大赛之最优秀单行代码

转自:http://blog.sina.com.cn/s/blog_6adee4450100m6o9.html


看这行代码:
printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);


看下面解释:
首先看一段代码:

代码:
#include

int main()
{
    int a[5]={1,2,3,4,5};
    printf("%d\n",3[a]);
    return 0;
}



在C语言中 其实数组的引用可以 3[a]这样的形式的. 等价于a[3];
再看下面一段代码:

代码:
#include

int main()
{
    int a[5]={1,2,3,4,5},i=4;
    printf("%d\n",3[a]);
    printf("%d\n",i[a]);
    return 0;
}



这样的表示也是可以的 实际上相当与 i[a]实际上相当于a[4]了

再看下面一段代码:

代码:
#include

int main()
{
    printf("%d\n",unix);

    return 0;
}



为什么我没有定义unix也能打印出来呢? 原因是unix 被编译器内定为一个 宏.
相当于#define unix 1 这样打印出来1

下面来解释一下这个问题.

代码:
#include

int main()
{

    printf("%c\n",(unix)["have"]);

    return 0;
}


这里的unix相当于1 那么 unix["have"]相当于 "have"[1] 我们都知道"have"是个字符数组. 那么 "have"[1]就相当于引用这个"have"数组下标为1的字符了 实际上就是a;


代码:
#include

int main()
{
    printf("0x%x",'a');
    return 0;
}


a的asc码的16进制表示为0x61.
(unix)["have"]+"fun"-0x60
中就相当于0x61-0x60+"fun"相当于 0x01+"fun" 相当于字符指针后移相当于"un"了
这样后面的部分解释完了。~

你可能感兴趣的:(乱码,C语言)