dc采用逆波蘭式計算表達式,計算過程是對棧的手動維護。逆波蘭式看起來很別扭,但跑起來當然是很有效率的。
亂七八糟的東西就不說了,直接切入script正題
負號在dc裡用_表示而非-,因為-是二元運算符“減號”
打印類命令:
p :打印棧頂元素並換行
n : 打印棧頂元素並將其彈出棧,完畢後不換行
P : putchar ( int(棧頂元素) % 256) 並彈棧頂,不換行
f : 從棧頂至棧底打印棧中所有值,每個一行
算數運算符:
+ : 依次彈出w1與w2,將w2+w1壓棧。精度為結果值精度
- : 依次彈出w1與w2,將w2-w1壓棧
* : 依次彈出w1與w2,將w2*w1壓棧。精度為結果值精度與precision中較大值
/ : 依次彈出w1與w2,將w2/w1壓棧。精度為precision
% : 依次彈出w1與w2,將w2-w2/w1*w1壓棧
~ : 依次彈出w1與w2,依次將w2/w1與w2%w1壓棧
^ : 依次彈出w1與w2,將w2^((int)w1)壓棧。精度為w2精度與precision中較大值
| : 依次彈出w1 w2與w3,將 w3 ^ ((int)w2) (mod w1) 壓棧。w1 w3 需為整數
v : 彈出w1,將sqrt(v)壓棧。精度為precision
棧操作:
c : 清空棧
d : 將棧頂元素復制並壓棧
r : 交換棧頂兩元素 XXX
寄存器操作:
dc提供至少256個寄存器,分別用256個字符表示。一般用'a'..'z',不夠可以用123ABC!@#,再不夠就用\x00..\xff
除了主棧外,每個寄存器都是獨立的棧,寄存器棧頂的值被稱為這個寄存器的值
sr : 彈出主棧頂元素w1,若r棧為空,則將w1壓入r棧,否則將r棧頂元素改為w1
lr : 將r寄存器的值壓入主棧
Sr : 彈出主棧頂元素w1,壓入r棧
Lr : 彈出r棧頂元素w1並將其壓入主棧