1.編譯器的選擇
我們的c語言是一門,我們寫的c語言代碼是文本文件(存放在.c為后綴的文件中),文本文件本身無法被執行,必須通過編譯器的編譯和鏈接器的鏈接,生成可執行的二進制文件,才能夠被執行
注意:
- 每個源文件(.c文件)通過編譯器生成目標文件(后綴為.obj的文件)
- 多個目標文件和庫文件通過鏈接器生成可執行文件(.exe文件)
3.一個工程里面一般會有多個源文件組成
編輯器和集成開發環境的區別
前面說到了我們c語言是一門編譯型的語言,需要編譯器將其轉換成機器能夠執行的機器指令
編譯器
msvc,gcc,clang是常見的編譯器
集成開發環境(IDE)
- 集成開發環境一般包含代碼編輯器,編譯器,調試器和圖形用戶界面等,集成了代碼編寫功能,分析功能,編譯功能,調試功能等一化的開發軟件服務套
- vs2022,XCode,CodeBlocks,Devc++都是常見的集成開發環境
vs2022集成了msvc,安裝包大一些,安裝簡單,無需多余配置,用起來很方便
XCode集成了clang,是蘋果電腦上的工具
CodeBlocks集成了gcc,這個工具需要配置,比較小眾
Devc++集成了gcc,小巧,但是工具過去簡單,對代碼風格的養成不好,通常是一些競賽在使用
2.main函數
每個c語言程序不管是有多少行的代碼,都是從main函數開始執行的,main函數是程序的入口,main函數前面的int表示函數結束的時候要返回一個整型類型的值,所以在main函數的最后寫return 0,正好前后呼應
- main函數是程序的入口
- main函數有且只能有一個
- 即使是一個項目里面有多個.c文件,也只能有一個main函數(因為程序的入口只有一個)
main函數的寫法
- 這是main函數過去的寫法
- void表示main函數不接受任何的參數
- 有參數的main函數
如果不想使用main函數的參數,可以不寫,這些參數就是多余的,等到需要的時候再寫
3.printf和庫函數
printf函數
printf是一個庫函數,功能是在標準輸出設備上(一般指屏幕)上進行信息的打印
庫函數
為了不再重復實現常見的代碼,提高程序員的開發效率,c語言標準規定了一組函數,這些函數由不同的編譯器實現,供程序員使用,這些函數組成了一個庫叫做標準庫,這些函數也被稱為庫函數
一個系列的庫函數一般會聲明在同一個頭文件里面,所以庫函數的使用,要包含對應的頭文件,比如stdio.h文件里面就是關于標準輸入輸出的函數
4.字符和ASCII編碼
在鍵盤上可以敲出各種的字符,a,@,#等都是字符,c語言中字符用單引號引起來,我們都知道我們的數據是以二進制的形式存儲的,我們一般會給字符進行二進制編號,給每一個字符編一個二進制序列,這就叫做編碼
但是每個人對字符進行編碼的序列會因人而異,為了統一,不造成混亂,美國國家標準學會出臺了一個標準ASCII編碼
當我們想打印一個字符的時候,我們可以直接用字母進行打印,也可以用該字符對應的ASCII的值來表示(如下圖)
注意:
- 字符A到Z的ASCII值是從65到90
- 字符a到z的ASCII值是從97到122
- 對應大小寫字符(A和a)的ASCII差值是32
- 數字字符0到9的ASCII值是從48到57
- 換行\n的ASCII值是10
- 這些字符中ASCII值從0到31的這31個字符是不可打印字符,無法在屏幕上觀察
5.字符串和\0
在c語言中字符串是用雙引號引起來的,字符串的打印格式是%s
在c語言的字符串中,字符串比較特殊,在字符串的末尾隱藏著一個\0,是字符串結束的標志,函數printf和strlen都是根據\0來判斷字符串是否結束的
如上圖我們以這種方式創建字符串,后面是有\0的
如果用上圖的方法來創建字符串的話就沒有隱藏的\0,于是這種情況在使用printf函數的時候,就會打印出一段亂碼才會停下,因為此字符串沒有\0,printf不知道字符串什么時候結束,直到打印到內存中其他的\0的位置才能停下(如下圖)
如果我們手動的給這個字符串加上\0的話,問題也就被解決了
如果我們打打印字符串的時候字符串的中間有\0的話,字符串的打印也會提前結束(如下圖)
6.轉義字符
轉移字符顧名思義就是轉變原來字符的意思
比如我們的字符n,原來的意思就是一個簡單的字母n,前面加上\了以后,就轉變了原來的意思,變成換行的意思了
轉義字符 | 作用 |
---|---|
\? | 在書寫多個問號的時候,防止他們被解析成三字母詞,比如我們要打印( are you ok??)的時候,??)就會被解析成],于是我們就在?的前面加上/,于是就將三字母詞里的問號轉化成了一個普通的問號,在這里問號的意思被轉變了(如下圖)![]() |
\’ | 表示字符常量‘,當我們想要打印一個’的時候,三個‘的時候會報錯,我們希望前后兩個’組成一隊,打印中間的‘,但是實際上前兩個’會組成一對,把最后一個‘剩下,于是程序就報錯了,所以我們需要中間的’只表示單純的字符,而不是字符兩邊的單引號![]() ![]() |
\” | 跟單引號是同理的 |
\\ | 用于表示一個反斜杠,防止它被解析成轉移字符![]() ![]() ![]() |
\a | 警報,這會使得終端發出警報聲或者出現閃爍,或者兩者同時發生 |
\b | 退格符,光標回退一個字符,但是不刪除字符 ![]() ![]() |
\r | 回車符,光標會移動到同一行的開頭,同樣的我們輸入一個字符同樣也會將這一行的第一個字符給覆蓋掉![]() |
\t | 制表符,光標移動到下一個水平制表符位,,也就是移動到下一個\t長度的倍數處,通常是4\8的倍數 |
\ddd | ddd表示一到三哥八進制的數字,表示將ddd轉換成十進制在ASCII表里面對應的字符,如\130就代表字符x![]() |
\xdd | dd表示兩個十六進制數字,表示將dd轉化為十進制在ASCII表里面對應的字符,比如\x30表示0![]() |
\0其實是\ddd類的轉義字符,0轉換為十進制也是0,對應的ASCII表里面編號為0的字符,但是由于\0標志著字符串的結束,所以0編號處的字符是不存在的,是空的
7.注釋
在編譯的時候,注釋會被替換為空格,比如min/*這是一個注釋*/Value在編譯之后會變成min Value,而不是minValue