1 memcpy函式:
函式原型:void *memcpy(void *dest, void *src, unsigned int count);
函式原始碼:
void *memcpy1(void *desc,constvoid *src,size_t size)
unsigned
char *desc1 = (unsigned char*)desc;
unsigned
char *src1 = (unsigned char*)src;
while(size-- >0
)
return
desc;
}
可見不管傳入的指標型別是什麼樣的最後都是轉換成位元組指標然後乙個乙個的複製的。
錯誤:自定義乙個結構體selfstr,然後用memcpy賦值一段記憶體
memcpy(&selfstr_dest[0],&selfstr_src[0],size);
這裡本意是想將selfstr_src自定義的結構體陣列的size個資料複製到selfstr_dest,這樣會出錯。
2 移位操作<< 、>>
ret = part0<<16 + part1<<8 + part2;
這是錯的,因為<<、>>運算子的優先順序低於+,所以這裡要打括號
ret = (part0<<16) + (part1<<8) + part2;
c運算子優先順序表:
優先順序運算子
名稱或含義
使用形式
結合方向說明1
陣列下標
陣列名[常量表示式]
左到右()
圓括號(表示式)/函式名(形參表)
.成員選擇(物件)
物件.成員名
->
成員選擇(指標)
物件指標->成員名2-
負號運算子
-表示式
右到左單目運算子
(型別)
強制型別轉換
(資料型別)表示式
++自增運算子
++變數名/變數名++
單目運算子
--自減運算子
--變數名/變數名--
單目運算子
*取值運算子
*指標變數
單目運算子
&取位址運算子
&變數名
單目運算子
!邏輯非運算子
!表示式
單目運算子
~按位取反運算子
~表示式
單目運算子
sizeof
長度運算子
sizeof(表示式)3/
除表示式/表示式
左到右雙目運算子*乘
表示式*表示式
雙目運算子
%餘數(取模)
整型表示式/整型表示式
雙目運算子4+
加表示式+表示式
左到右雙目運算子-減
表示式-表示式
雙目運算子
5<<
左移變數《表示式
左到右雙目運算子
>>
右移變數》表示式
雙目運算子
6>
大於表示式》表示式
左到右雙目運算子
>=
大於等於
表示式》=表示式
雙目運算子
<
小於表示式《表示式
雙目運算子
<=
小於等於
表示式<=表示式
雙目運算子7==
等於表示式==表示式
左到右雙目運算子
!=不等於
表示式!= 表示式
雙目運算子8&
按位與表示式&表示式
左到右雙目運算子9^
按位異或
表示式^表示式
左到右雙目運算子10|
按位或表示式|表示式
左到右雙目運算子
11&&
邏輯與表示式&&表示式
左到右雙目運算子
12||
邏輯或表示式||表示式
左到右雙目運算子
13?:
條件運算子
表示式1? 表示式2: 表示式3
右到左三目運算子14=
賦值運算子
變數=表示式
右到左/=
除后賦值
變數/=表示式
*=乘後賦值
變數*=表示式
%=取模後賦值
變數%=表示式
+=加後賦值
變數+=表示式
-=減後賦值
變數-=表示式
<<=
左移後賦值
變數<<=表示式
>>=
右移後賦值
變數》=表示式
&=按位與後賦值
變數&=表示式
^=按位異或後賦值
變數^=表示式
|=按位或後賦值
變數|=表示式15,
逗號運算子
表示式,表示式,…
左到右從左向右順序運算
犯過錯誤可以吸取教訓的題目
出界的路徑數 糾結於是否回到同乙個點,但是花一步走到a點和花x步走到a點是不一樣的。換句話說 start a start a b a 是不一樣的路徑。通過步數可以直接區分這兩種方式,而不需要記錄具體的走法。滿足dp的性質。關注到達了a點以及花了幾步,前面怎麼過來的不care。香檳塔陷入思維死區 不斷...
犯過的錯誤
1.touch專案 資料夾的子檔案下trigbuilder無法啟動,原因整個路徑有漢字,解決辦法就是刪除 專案 二字 2.想要實現原先沒有image的位置touch後出現,但接受不到pointer事件?原因image預設w h為0,即沒有可以touch的元素,所以接受不到pointer,解決辦法就是...
自己犯過的錯誤與經驗
關於stl容器的swap複雜度問題,春節十二響題解裡有人提到這句 swap 在不開 c 11 的情況下是 o n 的,開 c 11 則是 o 1 的,如果不開 c 11 可以記錄 id 然後交換 id 本人當時做一道需要用啟發式合併 set 的題,上洛谷發帖詢問這個問題,結果得到的答案很不統一。自己...