今天魚鷹介紹一個(gè)小知識點(diǎn),那就是如何在調(diào)試時(shí)進(jìn)行計(jì)算。在開發(fā)調(diào)試過程中,難免會遇到調(diào)試過程中需要臨時(shí)計(jì)算的情況,有些時(shí)候可能還需要?jiǎng)討B(tài)的得到計(jì)算結(jié)果。很多時(shí)候,我們都會打開 Windows 自帶的計(jì)算器,這確實(shí)一種解決方式,但是難免顯得麻煩,而對于需要多次計(jì)算的情況來說,更是如此。那么是否有更好的解決方式呢?當(dāng)然有,就是使用 MDK 自帶的命令行進(jìn)行計(jì)算。進(jìn)入調(diào)試模式后,MDK 自動會打開一個(gè)命令窗口,但估計(jì)絕大部分人都不知道這個(gè)窗口可以干什么用,今天魚鷹就介紹一個(gè)與此有關(guān)的使用,就是計(jì)算。
比如輸入以下公式(實(shí)際上,這里可以使用全局變量計(jì)算或當(dāng)程序停在局部函數(shù)時(shí)計(jì)算局部變量),得到結(jié)果為 0x04。
你會發(fā)現(xiàn)即使使用括號,也能計(jì)算出結(jié)果,比 Windows 自帶的計(jì)算器強(qiáng)。那么現(xiàn)在就看計(jì)算結(jié)果是否正確了。如果我們的小學(xué)數(shù)學(xué)過關(guān)的話,這個(gè)結(jié)果應(yīng)該是 5。但結(jié)果卻是 4,還是按照 16 進(jìn)制顯示的。仔細(xì)想想你就知道,這里的計(jì)算完全按照 C 的表達(dá)式形式進(jìn)行計(jì)算的(命令行下提示 C- style),這樣看來計(jì)算結(jié)果沒有問題。那我們嘗試使用浮點(diǎn)進(jìn)行計(jì)算:
發(fā)現(xiàn)結(jié)果是我們想要的,同時(shí)計(jì)算結(jié)果使用十進(jìn)制顯示。這里就需要注意一點(diǎn),如果說你想計(jì)算結(jié)果準(zhǔn)確,那么使用浮點(diǎn)計(jì)算是一個(gè)不錯(cuò)的選擇,否則你就要確定是否是在驗(yàn)證你的 C 語言表達(dá)式是否正確了。我們會想,是否可以設(shè)置結(jié)果為十進(jìn)制顯示呢?偶然情況下,魚鷹發(fā)現(xiàn),這個(gè)結(jié)果顯示和局表變量窗口有關(guān):
也就是說,如果局部變量顯示為十進(jìn)制,那么計(jì)算結(jié)果也是十進(jìn)制,反之亦然(默認(rèn)十六進(jìn)制顯示)。所以,現(xiàn)在我們有兩種十進(jìn)制顯示方式:1、將局部變量窗口設(shè)置為十進(jìn)制顯示 2、使用浮點(diǎn)計(jì)算(比如 1 寫成 1.0),那么結(jié)果一定是十進(jìn)制。魚鷹推薦第二種方式,比較方便,同時(shí)計(jì)算結(jié)果也不容易出錯(cuò)。事實(shí)上,除此之外,這個(gè)命令窗口還可以使用 sizeof,比如我想計(jì)算一下 int 的大小,可以這樣:
在這里可能不能體現(xiàn)這個(gè)命令窗口的優(yōu)勢,但如果說你想計(jì)算一個(gè)復(fù)雜的結(jié)構(gòu)體呢?!
還有如果我們想動態(tài)的知道兩個(gè)變量的差值(或其他表達(dá)式)怎么辦?正常情況下,我們會選擇修改代碼,將結(jié)果存放至全局變量顯示。但今天魚鷹再介紹一種更簡單的顯示方式,直接在 Watch 窗口計(jì)算:
但是要注意,如果這兩個(gè)變量修改的很快的話,可能會突然出現(xiàn)一個(gè)異常值,所以只能作為一個(gè)參考,不能看到一個(gè)異常值就認(rèn)為兩個(gè)變量有問題。但是暫停調(diào)試情況下,計(jì)算結(jié)果是可以相信的。