这个代码打印印度 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++相关问答推荐

从 C 文件调用 C++ 标准头文件 (cstdint)

引用如何出现在可从 C 代码调用的函数的签名中?

为什么将输出写入正在缓冲的管道

预处理器算法是否应该与编译所针对的体系结构相匹配?

将所有位从最低有效位翻转到最高有效最后 1 位值的最有效方法是什么?

&> 重定向是如何在 UNIX shell 中实现的?

将 char 转换为二进制字符串,反之亦然

C/C++ 编译器如何区分常规二维数组和指向数组的指针数组?

C printf中的'I'(大写i)标志是什么?

编译后的C代码对R'给出了不同的结果;他在用deSolve

union无法解码字节数组

假设指向同一个变量的两个指针是非法的/UB,为什么 C 编译器不能优化更改 const 指针的值?

我们可以在变量名中写注释吗?

为什么 rand() 在 Linux 上重复数字的频率远高于 Mac?

为什么glibc的strlen需要这么复杂才能快速运行?

C语言中i++和(i)++的区别

gcc中有128位整数吗?

为什么要在 C 和 C++ 项目中创建 include/ 目录?

在结构中,使用一个数组字段访问另一个数组字段是否合法?

为什么首选 uint32_t 而不是 uint_fast32_t?