-2

有人可以为我描述一下这个脑残的翻译吗?

    #include <stdlib.h>
    char m[9999], *n[99], *r = m, *p = m + 5000, **s = n, d, c;
    main() 
    {
       for (read(0, r, 4000); c = *r; r++)
              c - ']' || (d > 1 || 
              (r = *p ? *s : (--s, r)), !d || d--), c - '[' || d++ ||
              (*++s = r), d || (*p += c == '+', *p -= c == '-', p += c == '>', 
              p -= c == '<', c - '.' || write(2, p, 1), c - ',' || read(2, p, 1));
    }
4

1 回答 1

13

内部循环使用短路布尔表达式(和逗号运算符而不是分号)来评估每个 Brainfuck 令牌。

每个实例<expr a> || <expr b>都可以翻译成if (!<expr a>) { <expr b> }

逗号运算符的每次使用(r = *p ? *s : (--s, r))都可以用分号代替。

p <op>= <conditional>和的列表*p+= <conditional>可以替换为if (<conditional>) p <op>= 1if (<conditional>) *p <op>= 1。整个带括号的集合可以转换为if (!d) { ... }.

一旦你完成了所有这些,你最终会得到一个非常简单的brainfuck解释器。请记住,逗号运算符作为表达式从左到右计算。

于 2012-02-05T07:06:33.900 回答