全面系統的講解函式了。首先映入我眼簾的是一種奇怪的函式宣告方式:
main()
它在main函式中宣告了自己編寫的atof(char )函式。至於原因是什麼,我也不得而知了。
按照書上的說明,c**是不允許在乙個函式裡定義其它函式的,函式本身是external的。下面的**:
#include int main(void)
c = gou_gu(a, b);
printf("c = %.2f\n", c);
return 0;
}
在vs2010下面是不能通過編譯的,但是在gcc好像是可以的。
這一章一直圍繞著乙個例子,就是編寫乙個計算器程式,將輸入的一串字元轉化為逆波蘭輸入的數學表示式求出結果。為什麼這個問題處理的這麼複雜呢?原因在於書中還沒有介紹scanf,只能使用類似於getchar函式進行輸入。所以一切都變得這麼麻煩。舉一段例子:
int getop(char s)
if(isdigit(c))
while(isdigit(s[++i] = c = getch()))
;s[i] = '\0';
if(c != eof)
ungetch(c);
return number;
}int getch(void)
void ungetch(int c)
通過getop函式獲取輸入,然後在主函式裡通過switch-case語句判斷如何執行。由於是乙個字元乙個字元的如,所以每次都得多讀乙個字元,如果不能構成數字,那麼把它先壓倒乙個緩衝區中,每次讀的時候先把緩衝區裡的讀了,然後再從輸入流中讀。
程式中還有乙個比較費解的地方:s[1] = '\0';。這樣做的原因是如果輸入乙個字母a,那麼棧s[0] = a; s[1] 和以後的值就是隨機數了,導致整個棧沒有'\0',在main函式中列印:
printf("error: unknow command %s\n",s);
時,就會出錯。
書中還特別介紹了遞迴呼叫。用遞迴呼叫進行快速排序是乙個很不錯的例子,但是課後題中那個利用遞迴呼叫來反轉字元就有點坑爹了,實際意義不大。
最後還介紹了預處理方面的內容。
比如使用巨集。這裡主要介紹了是一些容易用錯的地方,比如使用巨集時,一定要把括號都括起來,否則如果巨集的輸入是x+y之類的,展開就錯了;其次,使用巨集的時候不要給引數帶上自增自減運算子,否則會使用對引數多次自增:
#define max(a,b) ((a)>(b) ? (a) : (b))
還有乙個例子是用巨集寫swap函式:
#define swap(t,x,y)
其中t是引數的型別設計巨集的原本目的,是因為函式呼叫開銷相對而言是比較大的,而使用巨集展開卻沒有這些開銷,所以對於一些反覆使用的函式,講它們設計成巨集可以提高程式的效率。但是有時候巨集很容易出錯(比如上面的例子),有時候不易閱讀(大家可以去看看mfc的那套架構,他沒有使用繼承派生體系,而是用了巨集);所以c++的發明人對巨集深惡痛絕,使用了內聯函式來代替巨集。
書中還提到了static的作用,這與我平時理解的大不相同。書中首先提到了,是為了隱藏外部物件:用static修飾的全域性變數或者函式,只能在本編譯單元中使用。用static修飾的區域性變數,它的值一直存在,這個用處是我之前理解的。
第四章筆記
一.引入樣式 1.行內樣式表 2.內部樣式表 在head標籤裡面,title標籤下面 優點方便在同頁面中修改樣式 缺點不利於在多頁面間共享復用 及維護,對內容與樣式的分離也不夠徹底 3.外部樣式表 嵌入式匯入式 嵌入式和匯入式的區別 1.標籤屬於xhtml,import是屬於css2.1 2.使用鏈...
第四章筆記
氣泡排序 從大到小 基本思想 兩層迴圈來完成,每一輪比較之後,把最小數沉到陣列的末尾,之後進行下一輪的比較,比較的次數減少一次,因為最後的數字已經是最小 外層迴圈控制比較的輪數,陣列的長度減一次 內層迴圈進行比較。int testarr for int i 1 i testarr.length 1 ...
第四章 python學習筆記
1 字典 字典是由 鍵值對 組成的無序可變序列 字典中每個元素都是乙個鍵值對 包含乙個 鍵物件 和乙個 值物件 鍵 是任意不可變資料 一般由 整數 浮點數 字串 元組 組成 鍵 在字典中是唯一的 不能重複 否則會被覆蓋 建立字典的方法 1 a 2 a dict name dafu age 18,jo...