说来话长,我是如何来到这里的;涉及 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);
}
}
它不会终止。
为什么这些看似相同的程序表现不同?我一定错过了一些明显的东西?
最佳答案
这些代码不相等:
- C 版本分配字节数组,而 Java 则分配整数数组
- 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/