背景
今天在寫代碼計算二叉樹根節(jié)點右孩子的下標值時,用了如下代碼:
/**
* 獲取根節(jié)點右孩子的的下標值
* @param i
* @return
*/
private int right(int i) {
return i << 1 + 1; // 右孩子為右移一位 + 1
}
當我發(fā)現(xiàn)程序結(jié)果跟我預(yù)期不一樣時,調(diào)試到此處胃惜,發(fā)現(xiàn)right(1)返回的結(jié)果是4!所以借此記錄鼎姐,只有踩坑的方式補基礎(chǔ)知識記憶才比較靠譜钾麸!后來我改成了如下代碼,就完美解決問題了炕桨。
/**
* 獲取根節(jié)點右孩子的的下標值
* @param i
* @return
*/
private int right(int i) {
return (i << 1) + 1; // 右孩子為右移一位 + 1
}
踩坑之后
遇到上面問題之后饭尝,我回顧了下運算符(主要還是位運算符,刻骨銘心)幾點tips:
- 怕錯就用括號献宫,括號優(yōu)先級是最高的
- 位運算符優(yōu)先級沒有‘+’(加號優(yōu)先級高)钥平,所以作者上面錯了
- 因為還用到了三元運算符的嵌套,所以看了下姊途,發(fā)現(xiàn)三元運算符由右向左以(涉瘾?:)為一對進行運算(我想了下,也是有語言自己設(shè)計的道理)捷兰。我用到的代碼如下立叛,可以不用加括號,但是最開始作者怕錯了贡茅,還是把括號加上了(this.arr[i] != INF ? true : false)秘蛇。
/**
* 檢查一個下標是否魏越界或者是否存儲了實際值
* @param i
* @return 在數(shù)組范圍內(nèi)返回true,越界返回false
*/
private boolean isLegal(int i) {
return 1 <= i && i <= this.size() ? this.arr[i] != INF ? true : false : false; // 首先判斷數(shù)組下標越界與否顶考,在沒有越界的基礎(chǔ)上還需要判斷是否是有效值
}
補一張運算符優(yōu)先級的圖赁还,雖然我知道我不怎么會看,便于參考吧驹沿。
運算符的優(yōu)先級.png