C++实现的Brainfuck解释器运行斐波那契代码输出异常求助
问题分析与解决方案
核心问题:循环跳转逻辑不符合Brainfuck规范
你的解释器在处理[和]的循环跳转时存在错误,导致斐波那契代码的执行流程完全偏离预期,最终输出异常。
标准Brainfuck规则中,当遇到]时:
- 若当前内存单元格值不为0,必须跳转到对应
[的位置,重新执行循环判断 - 若值为0,则退出循环,继续执行
]之后的代码
而你的代码中,触发跳转后设置i = temp.back(),随后循环末尾的i++会让下一次执行从[的下一个位置开始,直接跳过了[的判断步骤,彻底破坏了循环的执行逻辑,这是数值计算错误的根本原因。
修复方案
修改]的处理逻辑,确保跳转后回到[的位置重新执行:
方法一:使用continue跳过自增
case ']': if (memory[pointer] != 0) { i = temp.back(); // 跳转到对应[的位置 continue; // 跳过本次循环的i++,直接从[开始判断 } else { temp.pop_back(); } break;
方法二:调整i的偏移量
case ']': if (memory[pointer] != 0) { i = temp.back() - 1; // 让i++后刚好回到[的位置 } else { temp.pop_back(); } break;
输出逻辑适配
这段斐波那契Brainfuck代码的设计是输出ASCII字符形式的数字和分隔符(比如ASCII码49对应字符'1',44对应','),而非直接输出数字数值。修复解释器后,使用原始输出逻辑:
case '.': std::cout << memory[pointer]; break;
即可得到预期的1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89输出。
如果想直接输出数字数值,需要将内存中的ASCII码转换为对应数字:
case '.': std::cout << (static_cast<int>(memory[pointer]) - '0') << ", "; break;
验证修复
完成循环逻辑修复后,重新运行代码,控制台将输出符合预期的斐波那契数列。
内容的提问来源于stack exchange,提问作者PascalND
相关产品推荐
相关产品推荐

