java - 为什么这段 Java 代码的行为与这段 C 代码不同?

标签 java c brainfuck

说来话长,我是如何来到这里的;涉及 Brainfuck 到 C 编译器和 Brainfuck 到 JVM 字节码编译器......似乎无关紧要。 有问题的Brainfuck代码如下:

>-[[<+>>>-<-<+]>]

我有以下 C 代码:

#include <stdlib.h>
#include <stdio.h>

typedef unsigned char u8;

void m1();
void m2();

u8 *dp;

int main() {
    dp = (u8*) calloc(30000, sizeof(u8));

    dp += 1;
    *dp -= 1;
    while(*dp) {
        m1();
    }

    return 0;
}

void m1() {
    while(*dp) {
        m2();
    }
    dp += 1;
}

void m2() {
    dp -= 1;
    *dp += 1;

    dp += 3;
    *dp -= 1;

    dp -= 1;
    *dp -= 1;

    dp -= 1;
    *dp += 1;
}

此代码终止。

我有这个Java代码:

public class test {
    public static void main(String[] args) {
        new test().run();
    }

    int[] tape = new int[30000];
    int dp = 0;

    void adjust(int n) {
        tape[dp] += n;
        if(tape[dp] < 0) tape[dp] += 255;
        if(tape[dp] > 255) tape[dp] -= 255;
    }

    void run() {
        dp += 1;
        adjust(-1);
        while(tape[dp] != 0) {
            m1();
        }
    }

    void m1() {
        while(tape[dp] != 0) {
            m2();
        }
        dp += 1;
    }

    void m2() {
        dp -= 1;
        adjust(1);

        dp += 3;
        adjust(-1);

        dp -= 1;
        adjust(-1);

        dp -= 1;
        adjust(1);
    }
}

它不会终止。

为什么这些看似相同的程序表现不同?我一定错过了一些明显的东西?

最佳答案

这些代码不相等:

  1. C 版本分配字节数组,而 Java 则分配整数数组
  2. C 版本不像 Java 那样对数组元素进行限制

所以在 Java 中你应该创建一个字节数组:

byte[] tape = new byte[30000];

并删除 adjustment() 函数中的限制:

 // if(tape[dp] < 0) tape[dp] += 255;
 // if(tape[dp] > 255) tape[dp] -= 255;

然后Java的版本也终止

或者如果您想保留整数数组 - 那么您必须更改上溢/下溢规则:

 if(tape[dp] < 0) tape[dp] = 256-Math.abs(tape[dp]) % 256;
 if(tape[dp] > 255) tape[dp] = tape[dp] % 256;

因为你实现得不正确

关于java - 为什么这段 Java 代码的行为与这段 C 代码不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53790611/

相关文章:

java - Java 2 Micro版本(J2ME)中与互联网连接的问题

C token 解析

c - 使用求和查找从 1 到 1000 万的丰富数字

resources - Brainfuck中简单程序的源代码?

脑残。如何检查回文?

c - 数据段前未初始化的可写数据

java - 如何在 Spring-Boot 中配置日志记录框架?

java - 阻止选择 SmartGWT IPickTreeItem 的某些值

java - 哪个是处理离线数据的最佳数据库应用程序?

c - IIR滤波器差分方程中负指标的处理