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