C語言筆記1

1. C語言整數除法,無論操作數是正還是負,都把小數部分截掉,在數軸上表現爲向零的方向取整。


2.  %取餘運算(取模運算)結果符合總是與被除數相同。(不同編程語言對取模運算的規則各不相同)。


3. 浮點型的精度度有限,不適合用==運算符做精確比較。且不同平臺浮點數實現有許多不同之處。


4. 在編程語言中,用來表示邏輯真和假的類型稱爲布爾類型,C語言中沒有專門的布爾類型,布爾類型通常用int類型表示,非0表示真,0表示假。(C99也定義了專門的布爾類型_Bool,但目前沒有被廣泛使用。)


5.  switch 語句的優點: 

     (1)代碼清晰。

     (2)有時候編譯器會對其進行整體優化,較等價if/else生成的指令效率更高。


6. 函數返回一個值相當於定義一個和返回值類型相同的臨時變量並用return後面的表達式來初始化


7. 每次都有一點區別的重複工作稱爲迭代。


8. 遞歸能解決的問題用循環也能解決,但解決問題的思路不一樣。用遞歸解決這個問題靠的是遞推關係n!=n·(n-1)!,用循環解決這個問題則更像是把這個公式展開了:n!=n·(n-1)·(n-2)·…·3·2·1。

遞歸 : 函數式編程思想,描述要做什麼。

循環 : 命令式編程思想,描述一步一步要做什麼。


9. 多次對變量賦值時很危險的事。


10. 我們看一個有意思的問題:a+++++b這個表達式如何理解?應該理解成a++ ++ +b還是a++ + ++b,還是a + ++ ++b呢?應該按第一種方式理解。編譯的過程分爲詞法解析和語法解析兩個階段,在詞法解析階段,編譯器總是從前到後找最長的合法Token。把這個表達式從前到後解析,變量名a是一個Token,a後面有兩個以上的+號,在C語言中一個+號是合法的Token(可以是加法運算符或正號),兩個+號也是合法的Token(可以是自增運算符),根據最長匹配原則,編譯器絕不會止步於一個+號,而一定會把兩個+號當作一個Token。再往後解析仍然有兩個以上的+號,所以又是一個++運算符。再往後解析只剩一個+號了,是加法運算符。再往後解析是變量名b。詞法解析之後進入下一階段語法解析,a是一個表達式,表達式++還是表達式,表達式再++還是表達式,表達式再+b還是表達式,語法上沒有問題。最後編譯器會做一些基本的語義分析,這時就有問題了,++運算符要求操作數能做左值,a能做左值所以a++沒問題,但表達式a++的值只能做右值,不能再++了,所以最終編譯器會報錯。


11. goto語句的唯一限制就是隻能跳轉到同一個函數中的某個標號處。goto語句最主要的用途是做出錯處理。


12. 五種後綴運算符:後綴++、後綴--、結構體取成員.、數組取下標[]、函數調用()。還學習了五種單目運算符(或者叫前綴運算符):前綴++、前綴--、正號+、負號-、邏輯非!。在C語言中後綴運算符的優先級最高,單目運算符的優先級僅次於後綴運算符,比其它運算符的優先級都高。


13. 數組做右值使用時自動轉化爲指針類型。


14. C語言的設計精神是:相信每個C程序員都是高手,不要阻止程序員去幹他們需要乾的事,高手們使用count[-1]這種技巧其實並不少見,不應該當作錯誤。


15. 調用C標準庫函數rand()得到的隨機數其實是僞隨機(Pseudorandom)數,是用數學公式算出來的確定的數,只不過這些數看起來很隨機,並且從統計意義上也很接近均勻分佈(Uniform Distribution)的隨機數。


16. 函數內的註釋要儘可能少用。寫註釋主要是爲了說明你的代碼“能做什麼”(比如函數接口定義),而不是爲了說明“怎樣做”,只要代碼寫得足夠清晰,“怎樣做”是一目瞭然的,如果你需要用註釋才能解釋清楚,那就表示你的代碼可讀性很差,除非是特別需要提醒注意的地方纔使用函數內註釋。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章