2014-02-15 38 views
1

我是該語言的新用戶。Brainfuck語言中的內存索引

命令<用於遞減內存索引的指針。

下面的代碼是添加兩個單個數字的數字。

根據這個程序,它首先獲取輸入,然後將其存儲在內存[0]中,因爲最初內存索引位於位置0.然後遞減內存索引,使其現在爲-1,因此它應該顯示運行時間。爲什麼它在IDEone中成功運行?

內存塊是否在循環中?

,       ;read character and store it in p1 
------------------------------------------------ ;return ascii to Dec 
<       ;move pointer to p2 (second byte) 
,       ;read character and store it in p2 
------------------------------------------------ ;return ascii to Dec 
[       ; enter loop 
-       ; decrement p2 
>       ; move to p1 
+       ; increment p1 
<       ; move to p2 
]       ; we exit the loop when the last cell is empty 
>       ;go back to p1 
++++++++++++++++++++++++++++++++++++++++++++++++  ;return Dec to ascii 
.       ;print p1 
+1

恐怕真的不清楚你問的是「內存塊是否在循環中?」。 –

+0

對不起我的英語不好,它是否工作,如果內存索引= 0,我們執行索引 - 那麼如果內存大小是3000,那麼索引值變成3000? – user2124441

回答

1

該代碼明顯有一個bug,所有<應該是>,反之亦然。

如果嘗試減少指針過去未定義的值,會發生什麼情況。一些解釋者崩潰,一些環繞。

最好總是假設解釋器會崩潰。這有一個簡單的原因。某些實現不會將磁帶綁定到30000個單元,並且會在它請求時立即添加內存。因此,對於磁帶沒有「結束」,因此從0開始無法環繞到最後(因爲沒有一個)

0

那麼,從理論上回答你的問題基礎。

首先,你應該知道,brainfuck被設計爲turing-complete。 brainfuck的

圖靈completness假定通過本身該語言可以用來模擬任何單膠粘Turing machine

Definition of turng machine假定無限膠帶

無限的記憶是不可能得到的。爲了假裝磁帶是無限的,你應該使用盡可能多的內存。

如果你的記憶已滿,你應該拋出一個異常,因爲一旦記憶是有限的,brainfuck根本沒有意義。

0

這真的取決於口譯員。原始語言由30,000個存儲單元組成。許多人選擇循環到最後一個單元格,如果在單元格零遞減以避免拋出異常。