Coding
與python不同,C/C++在運行程式前,需先編譯完成後,產生執行檔,而python則是會直接將程式碼直接吃進去,做內部編譯後,直接執行程式,因此不須產生執行檔。
為一種高階語言
具有可攜性(容易編譯成不同機器所使用的機器語言
可寫出較有效率的程式
3.1 可以利用較為接近機器碼的方式存取記憶體
3.2 語法可以對應到較有效率的機器碼
具有多版本:最常見的版本為C 89(ANSI C),而最新版本為C 11(ISO C),因此在討論前要先知道為使用哪個版本
具有向前相容性
使用不同編譯器的差別:
6.1 效率
6.2 相容性
6.3 行為一致性
在使用C語言時,通常會在程式碼的執行區域內將main()區域的回傳值設定為int,也就是如下:
這其實是在標準文件中所定義的,main()此程式的回傳值須為int型態,但即使真實情況下回傳值不是int,程式碼也可照常執行,只會會給予警告(warning),且若回傳值為int型態時,可能會依照回傳型態跑到相對應的exit(若為return 0 則可能執行exit(0),有點像網站給予的error訊息)。
在C語言內的文字描述中,會使用雙引號("),包住所要印出的字樣或是字元,而在當中,若是想要使得特殊字元能夠跳出規則,則需要使用跳脫的手法,常見手法如下:
跳脫序列 | 代表字元 |
---|---|
\n |
換行 |
\" |
雙引號 |
\\ |
反斜線 |
\' |
單引號 |
\t |
跳位 |
行數限制
在高階語言中,即使重複執行一個重複碼多次,在此舉例printf而言,在經過編譯後未必會執行較多次(機器碼未必比較難),但是依然還是可以使用BigO做基礎判斷。
輸出整數時,常見的格式符
格式符 | 輸出格式 | 以十進位的123為例 |
---|---|---|
d or i | 十進位有號整數 | 123 |
u | 十進位無號整數 | 123 |
o | 八進未無號整數 | 173 |
x(小寫) | 十六進位無號整數(小寫) | 7b |
X(大寫) | 十六進位有號整數(大寫) | 7B |
輸出浮點數時常見的格式符
格式符 | 輸出格式 | 範例 |
---|---|---|
f | 十進位浮點數 | 123.45 |
e | 科學記號表示法(小寫) | 1.234500e+02 |
E | 科學記號表示法(大寫) | 1.234500E+02 |
scanf輸入時常見的格式符
格式符 | 輸入格式 | 範例 |
---|---|---|
i | 任何格式的整數 | 123 |
d | 十進位的有號整數 | 123 |
u | 十進位的無號整數 | 123 |
f | 十進位的浮點數 | 123.45 |
在C語言中,如果有多組相鄰字串放在同個printf,則會視為相同字串,以方便可讀性,如下:
註解:在C語言內,scanf必須直接指定要寫入的地址,而不是指定寫入的變數
當今天想要使用多個scanf輸入時(可能出現在while迴圈),會由於scanf本身特性,再輸入完成後點擊的迴車鍵(enter),會被儲存在緩衝區,導致被重複輸入,若要使用scanf連續輸入,解法如下:
可使用sanf的回傳值判讀
資料型態 | 名稱 | 大小(位元組) | 例子 |
---|---|---|---|
短整數(short) | short int | 2* | 32 |
整數(integer) | int | 4* | 32 |
長整數(long integer) | long int | 4* | 32 |
字元(character) | char | 1 | '3' |
單精度浮點數(single-precision floating point) | float | 4* | 3.2 |
倍精度浮點數(double-precision floating point) | double | 8* | 3.2 |
無 | void | ? |
在查看佔用記憶體大小時,可使用sizeof觀看,因為在不同的編譯器內不同型態對記憶體的佔用情況可能會有所不同。
由於C語言是一種靜態語言,因此在使用變數前,需要先定義變數的資料型態。
不同資料型態間的差異:
一個位元(bit)可存一個資料,分別為0 or 1,而一個位元組(byte)內有八個位元
當使用long int型態時,代表記憶體內有232bit能儲存資料,因此則有同樣多數量的unsigned 整數,以及1/2倍的signed整數。
整數的溢位(overflow),代表運算出的結果超過原本可儲存範圍,則代表會成為未定義行為
優點
缺點
在運算時,運算完的型別會與運算過程的型別相同:
字面常數:
常見字面常數 | 型別 |
---|---|
123 | int,long int |
123.45 | double |
123.45f | float |
所以如果要用除法或乘法轉型成double,則當中必定需要有一個double的型態,若兩者皆為int相除,則會變成捨去餘數,求得商數。因此將3轉成3.這個過程稱為隱性轉型(從int轉為double),而若是兩個不同型態的數值做運算時,會將結果隱性轉成範圍較大的型別,並輸出該型別的值。
儲存時將長怎樣以及意義分開
中文字在使用上可使用: 1.多個char 2.wchar_t
使用char型別做運算:
大小寫轉換練習表:
在C語言內做大小比較時,只能兩兩相比,例如:如果寫成3>2>1,則會先比較3>2回傳1(因為成立),之後用回傳的1與1相比,則會回傳0,因此不能做連續比較。
在"或"的情況下,只要一者為正確,及回傳1
運算子 | 意義 | 範例 | 相等於 |
---|---|---|---|
+= | 加等於 | a += 2 | a = a + 2 |
-= | 減等於 | a -= 2 | a = a - 2 |
*= |
乘等於 | a *= 2 |
a = a * 2 |
/= | 除等於 | a /= 2 | a = a / 2 |
%= | 求餘等於 | a %= 2 | a = a % 2 |
吃到飽餐廳,1人300元(無額外費用)。今日每桌消費滿3000打八折,試寫出一程式讓服務生輸入一桌的消費人數後,輸出該桌顧客應付的總額。
輸入某三角形的三邊(皆為整數),判斷此三角形是否為正三角形?
輸入某三角形的三邊(皆為整數),判斷此三角形是否為直角三角形?
基本switch述句
如果沒有break,則會運行完完整的程式碼,因此可以利用break分隔不同case,如下
猜數字直到完全猜對為止
藉由do-while搭配switch編寫簡易點算錢系統:
韓信命令士兵 3 人一排,結果多出 2 名;接著命令士兵 5 人一排,結果多出 3 名;他又命令士兵 7 人一排,結果又多出 2 名,試輸入一值,並輸出從零開始到該值中間所有符合韓信點兵之數值。
註解:函式內無法再定義其他函式
在呼叫函式前,需要先宣告或是定義函數,此原因是由於編譯前,會由前往後編譯,因此需要在呼叫前先編譯過函式,若今天函式本體需要在main()之後定義,則可以在main()前先"宣告"函式。
主要提供下列功能:
標頭檔:
注意事項: