# C語言入門 * C語言可寫出相比其他高階語言,較具有效率的程式,可產生彷彿直接撰寫機器語言所寫出來的程式。  *  *  (跳位: 往後跳8個字元) * printf("" "" "")相當於printf(""),編譯器在編譯的時候會把這幾個雙引號的內容合起來。 如: printf("aa\n" "bb" "cc"); 會印出:  * 寫C程式時須兼顧可讀性與效率 *  * 撰寫程式碼時考慮的要點: 程式行數與複雜度決定中央處理器效率;變數宣告多寡決定記憶體的用量。現今以CPU效率為優先考量。 *  * printf("輸入為奇數?%c\n", input & 1 ? 'Y' : 'N'); (所有非零值都是True)  * 浮點數 = 有效數字 + 指數 優點: 可表示範圍較整數廣且較不易overflow 缺點: 約略值較不精確、運算效率較整數差 *   * double資料型態較float表示範圍大且精確度準;將double轉成float可能造成誤差且溢位 * Why does scanf() need "%lf" for doubles, when printf() is okay with just "%f"? --> Because C will promote floats to doubles for functions that take variable arguments. Pointers aren't promoted to anything, %f for float %lf for double %Lf for long double *  * C語言一次僅能執行一個運算子,ex:  所以此表示式會得出0的結果 *  * Why does scanf require &?  * 為何使用switch時,每個case後面要加上break --> 不同case之間,可共用同一段程式碼  * do-while與while唯一差異僅在於do-while忽略第一次條件判斷,無論如何皆會執行第一次程式動作 * do-while格式為: do{...} while(...); --> while後須加分號以和一般while做區分 *  * 假設在同一行程式給同一個變數兩次以上的值,稱為未定義行為(產生不被預期之結果)  *  *  *  *  *  * 倘若函式回傳值型態為void,不需要有return值,當執行至函式末尾,將自動執行return *  * 使用%c說明是輸入一個字符此時可以scanf可以接受空格,但其他控制符都以空格為結束,如%d、%s都是以空格為結束 * 區域變數假設未初始化為未定義行為,全域變數倘若未初始化亦會自動設成0 * 全域變數在呼叫main()之前(編譯前)即完成初始化;不能以函式呼叫or其他全域變數來初始化全域變數;只可用簡易數字做初始化 * 有號整數的溢位為未定義行為。而  * 一個程式碼可以被切割成眾多檔案,使用static命名的全域變數,只有在該檔案內可被使用;若在函式內宣告static區域變數,則只會初始化一次。 * -靜態變數的生命週期由第一次宣告開始,直到程式結束而一起消失。 -宣告靜態變數時,只要在變數宣告最前面加上static。 -由於靜態變數由第一次宣告就一直存在,所以若初始化變數於宣告的同時,數值便不會再次初始化,而是保持變化後的數值。 -當區域變數沒有特別宣告為靜態變數時會為自動變數,會自動決定生命週期。 *  //陣列作為參數傳遞至函式時,本身不是陣列; 因此sizeof運算子無法求得函式間傳遞之陣列的實際大小 *  *  * 字元陣列初始化大小不得小於字串長度;可大於字串長度,後面多餘部分會自動填補'\0'; #特殊狀況(等於字串長度),則需額外記住字串長度並適時傳入:  * 從鍵盤輸入讀入一列字串  * 假設scanf讀入之資料型態有誤,其stdin中的錯誤資料並不會因此被清除,而是持續留下錯誤  --> 可在"Error: invalid input\n"後加上 fflush(stdin); //在include<stdlib.h>中利用fflush清空stdin標準輸入的資料 *  *  * 整數與浮點數之間存在隱性轉型,但整數指標及浮點數指標之間不存在轉型 * //第三行與 result = count; 等價  *  *  * 常數不具記憶體位址,變數才有(才可用&)  *   * ###陣列型別可轉型為指標  並透過指標運算存取陣列元素  * 重要易混淆之概念:  * 使用指標在函式間傳遞陣列 1. 陣列當引數傳 2. 參數型態為指標 3. 函式內部,指標相當於作為陣列使用  * 指標與遞增遞減運算子  * p++ //會先執行整個敘述後再將p的值加1 ++p //先把p的值加1,再執行整個敘述 * #虛線裡的資料為C語言系統自動產生且Read-only。宣告字元陣列時可改字元但不可改整串;宣告字元指標時恰好相反  * #strB 前面加了const 因此不能修改strB[0] 但是仍可以改指到其他字面常數 如"Test"  * 易混淆概念: -採用1和3,避免使用2,因為2意義不明易誤用 -7、8: 陣列無法直接被賦值,不能放在等號左邊 -9: 字元陣列可隱性轉型成字元指標,指標裡儲存陣列首元素位址 -10: strC為read-only,不允許其位址複製給strB,避免strB進行修改 -11: 字元陣列先轉成字元指標,字元指標接著轉成const字元指標,即原本可讀可寫變為僅可讀  *  //前面無加const,因此須確保空間有實際配置(代表空間存在且可寫入),此處不可使用字元指標  * 1. 以小括弧中的*q優先解釋 --> q是一個指標,此指標儲存的記憶體位址為整個三元素陣列之位址,但中括弧裡的數字不可為空 2. 此方法可使用sizeof,但第一點中括弧裡的數字須持續做變動   3. 當把整數陣列隱性轉型成指標時,即失去長度的概念,此時需額外再傳遞一個size參數。雖無法採用sizeof,但可保持共用同一個print函式  *  *   *  *  *   *  //指標變數初始化為0表示無指向任何記憶體位址  * //realloc所回傳的記憶體位址與起初傳進去之記憶體位址ptr可能為同一個   * 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up