第十五課 c語言8 switch語句
初步測試感覺switch在反彙編的語句和if語句的唯一差別就是jcc語句比較集中
當分支大於四條時,switch的反彙編開始變
3為switch傳入的值,1是case最小值,4是case最大值減1,算出偏移量後透過偏移量4加上基址就可以在大表中獲取要輸出的case語句的地址
當現在case的值不連續,空掉一個202時,大表的第二個地址會用default填充,如果case從201到209,我們刪掉中間三四個值,他還是會用default填充
如果是刪剩201,207,208,209,那麼switch反彙編又會開始不一樣,會生成一張大表和小表,從小表查出偏移量,再去4加上基址得出case想要輸出的語句的地址,小表有00,01,02,03,04對應著大表五個地址,分別是201,209,210,211和default的輸出語句,和只有一張大表直接用default填充的方法相比,這個只需用一個位元組04這個偏移量來填充,而04偏移量指向的就是default的地址,更省空間
總結
4、分支少於4時,用switch沒有意義,因為編譯器會生成類似if...else之類的反彙編.
5、case後面的常量可以是無序的,並不響大表的生成
6、所以switch語句的case最好是相近連續的,他可以生成大表,比if...else語句效率更高
7、抹去一兩項會直接在大表用default語句的地址填充
8、抹去多項時,會生成一個小表代替大表填充default的地方
9、會使用類似if..else反彙編
作業
第十六課 c語言9指標1
1.宣告
在之前學習的任何型別都可以加上數個*,就變成了一種新的型別,叫做指標。
總結:
2.寬度
和區域性變數不一樣,雖然都是佔12個位元組,但是真正使用時不管char,short還是int或者結構體型別也都還是4個位元組
3.賦值
總結:
4.+-常數
我們暫時先理解加號這種型別的++--的運算是不一樣的,不是直接加1,而是加上自身減去一個的寬度,比如char**減去一個號為char,char寬度為4個位元組,所以char的++應該是+4
+5和++同理,相當於五個++
總結 :
5.求差值
還是同理,砍星後根據寬度去除
而且求差值還得相同型別才可以相加減
兩個char相減得出的結果是一個int型別,不能用char接收
總結:
6.比較
總結:
作業
第十七課 c語言10 指標2
1.型別轉換
基本資料型別之間可以直接賦值或者強轉
基本資料型別和其他型別之間則無法直接賦值或者強轉
指標之間可以強轉但是不會自動轉換直接賦值
一級指標二級指標之間也沒辦法自動轉換直接賦值,但是可以強轉
2.&地址符
&可以去變數的地址,我們現在取完放在char y變數,發現報錯了char不能轉為char型別,得知**&取地址後是char型別
char型別的變數x取地址後是char*型別**
&取地址符反彙編
3.*取值符
*的型別
*反編譯
從這個例子已經可以看出上節課指標型別運算為什麼不同了