这个代码打印印度 map .它是如何工作的?

#include <stdio.h>
main()
{
    int a,b,c;
    int count = 1;
    for (b=c=10;a="- FIGURE?, UMKC,XYZHello Folks,\
    TFy!QJu ROo TNn(ROo)SLq SLq ULo+\
    UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^\
    NBELPeHBFHT}TnALVlBLOFAkHFOuFETp\
    HCStHAUFAgcEAelclcn^r^r\\tZvYxXy\
    T|S~Pn SPm SOn TNn ULo0ULo#ULo-W\
    Hq!WFs XDt!" [b+++21]; )
    for(; a-- > 64 ; )
    putchar ( ++c=='Z' ? c = c/ 9:33^b&1);
    return 0;
}

推荐答案

长字符串只是转换为ASCII的二进制序列.第一个for语句使b从10开始,字符串后的[b+++21]产生31.将字符串视为一个数组,偏移量31是字符串中"实"数据的开头(您提供的代码示例中的第二行).其余的代码只是在位序列中循环,将1和0转换为!"一次打印一个字符.

模糊程度较低的版本:

#include "stdio.h"
int main (void) {
    int a=10, b=0, c=10;
    char* bits ="TFy!QJu ROo TNn(ROo)SLq SLq ULo+UHs UJq TNn*RPn/QPbEWS_JSWQAIJO^NBELPeHBFHT}TnALVlBLOFAkHFOuFETpHCStHAUFAgcEAelclcn^r^r\\tZvYxXyT|S~Pn SPm SOn TNn ULo0ULo#ULo-WHq!WFs XDt!";
    a = bits[b];
    while (a != 0) {
        a = bits[b];
        b++;
        while (a > 64) {
            a--;
            if (++c == 'Z') {
                c /= 9;
                putchar(c);
            } else {
                putchar(33 ^ (b & 0x01));
            }
        }
    }
    return 0;
}

奇怪的聪明的部分出现在putchar条语句中.以前putchar名为例.ASCII 'Z'是十进制的90,所以90/9=10,这是一个换行符.在第二种情况下,十进制33是'!'的ASCII.切换33的低位会得到32,这是一个空格的ASCII码.如果b为奇数,则打印!,如果b为偶数,则打印空白.剩下的代码只是在字符串中遍历"指针"a.

C++相关问答推荐

不同到达时间的轮询实现

由Go调用E.C.引起的内存快速增长

C:scanf(%d&q;,...)输入只有一个减号

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

有没有可能我不能打印?(C,流程)

在c++中使用堆栈的有效括号

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

在为hashmap创建加载器时,我的存储桶指向它自己

使用nmake for程序比Hello World稍微复杂一些

可变宏不能编译

将数字的每一位数平方,并使用C将它们连接为一个数字(程序不能正确处理0)

Valgrind正在使用一个Fexecve电话报告不可能发生的事情

有没有办法减少C语言中线程的堆大小?

基于蝶数恰好有8个除数的事实的代码

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

当我在34mb的.mp4文件中使用FREAD时,我得到了一个分段错误,我如何解决它?

C中的char**v*char[]

如何在C中处理流水线中的a、n命令?

关于不同C编译器中的__attribute__支持

快速准确计算double的小数指数