# 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.