看程式設計珠璣,深知二分搜尋的用處之大,自己寫了一遍,竟然出了死迴圈。**如下:
1int bsearch(int *data, int val,int left, int
right)213
else
14return -1
;15 }
感覺沒有特殊的地方,經過除錯發現,第5行,當left = 5 ,right = 9時,mid = 5 + (9-5)>>1;結果是4 !!!!為何不是7? 運算子優先順序,+號 高於 位運算子。 相當於 (5 + (9-5))>>1 ,剛好陣列內data[4] < val ,造成死迴圈。。。
附1、折半搜尋的遞迴和非遞迴實現:
1 #include 2 #include 34using
namespace
std;56
//遞迴實現
7int bsearch(int *data, int val,int left, int
right)819
else
20return -1;21
}22//非遞迴實現
23int bsearch2(int *data,int val,int left,int
right)
2435
return -1;36
}3738int
main()39;
43 sort(d,d+10
);44 printf("
%d\n
",bsearch2(d,3,0,9));//
呼叫時,left為0,right為n-1
4546
return
0;
47 }
附2、運算子優先順序:
優先順序運算子
名稱或含義
使用形式
結合方向說明1
陣列下標
陣列名[常量表示式]
左到右()
圓括號(表示式)/函式名(形參表)
.成員選擇(物件)
物件.成員名
->
成員選擇(指標)
物件指標->成員名2-
負號運算子
-表示式
右到左單目運算子
(型別)
強制型別轉換
(資料型別)表示式
++自增運算子
++變數名/變數名++
單目運算子
--自減運算子
--變數名/變數名--
單目運算子
*取值運算子
*指標變數
單目運算子
&取位址運算子
&變數名
單目運算子
!邏輯非運算子
!表示式
單目運算子
~按位取反運算子
~表示式
單目運算子
sizeof
長度運算子
sizeof(表示式)3/
除表示式/表示式
左到右雙目運算子*乘
表示式*表示式
雙目運算子
%餘數(取模)
整型表示式/整型表示式
雙目運算子4+
加表示式+表示式
左到右雙目運算子-減
表示式-表示式
雙目運算子
5<<
左移變數《表示式
左到右雙目運算子
>>
右移變數》表示式
雙目運算子
6>
大於表示式》表示式
左到右雙目運算子
>=
大於等於
表示式》=表示式
雙目運算子
<
小於表示式《表示式
雙目運算子
<=
小於等於
表示式<=表示式
雙目運算子7==
等於表示式==表示式
左到右雙目運算子
!=不等於
表示式!= 表示式
雙目運算子8&
按位與表示式&表示式
左到右雙目運算子9^
按位異或
表示式^表示式
左到右雙目運算子10|
按位或表示式|表示式
左到右雙目運算子
11&&
邏輯與表示式&&表示式
左到右雙目運算子
12||
邏輯或表示式||表示式
左到右雙目運算子
13?:
條件運算子
表示式1? 表示式2: 表示式3
右到左三目運算子14=
賦值運算子
變數=表示式
右到左/=
除后賦值
變數/=表示式
*=乘後賦值
變數*=表示式
%=取模後賦值
變數%=表示式
+=加後賦值
變數+=表示式
-=減後賦值
變數-=表示式
<<=
左移後賦值
變數<<=表示式
>>=
右移後賦值
變數》=表示式
&=按位與後賦值
變數&=表示式
^=按位異或後賦值
變數^=表示式
|=按位或後賦值
變數|=表示式15,
逗號運算子
表示式,表示式,…
左到右從左向右順序運算
上表參考:
位運算子 優先順序 折半搜尋
看程式設計珠璣,深知二分搜尋的用處之大,自己寫了一遍,竟然出了死迴圈。如下 1 int bsearch int data,int val,int left,int right 213 else 14return 1 15 感覺沒有特殊的地方,經過除錯發現,第5行,當left 5 right 9時,m...
運算子優先順序 C 運算子優先順序
c 運算子優先順序 優先順序運算子 描述方向1 scope resolution 範圍解析 left to right 2 suffix postfix increment and decrement 字首 字尾遞增和遞減 function call 函式呼叫 array subscripting ...
運算子優先順序 Python 運算子優先順序
python 運算子優先順序 運算子描述 lambda lambda表示式 or布林 或 and布林 與 not x 布林 非 in,not in 成員測試 is,is not 同一性測試 比較 按位或 按位異或 按位與 移位 加法與減法 乘法 除法與取餘 x,x 正負號 x 按位翻轉 指數 x.a...