大家好啊,我是小象?(?òωó?)?
我的博客:Xiao Xiangζ?????
很高興見到大家,希望能夠和大家一起交流學習,共同進步。*
這一課主要是讓大家初步了解C語言,了解我們的開發環境,main函數,庫函數,關鍵字,字符和字符串等內容的介紹,后面會一一講解
文章目錄
- 一. C語言是什么
- 1.1 C語言的歷史
- 二. 開發環境
- 編譯型語言和解釋型語言
- 2.1 編譯和鏈接
- 2.2 編譯器的選擇
- 2.2.1 VS項目和源文件、頭文件介紹
- 2.2.2在VS創建項目
- 三、第一個C語言程序
- 四、main函數
- 五、printf和庫函數
- 5.1什么是庫函數呢
- 六、關鍵字介紹
- 七、字符和ASCII編碼
- 八、字符串和\0
- 九、轉義字符
- 十、語句和語句分類
- 10.1 空語句
- 10.2 表達式語句
- 10.3 函數調用語句
- 10.4 復合語句
- 10.5 控制語句
- 十一、注釋
- 11.1注釋的兩種形式
- 11.1.1/**/形式
- 11.1.2//形式
- 11.2 注釋會被替換
- 十二、結尾
一. C語言是什么
我們都知道,人和人交流使用的都是自然語言,而對于計算機來說,CPU唯一認識的語言是機器語言,也就是計算機語言。
計算機能識別的是二進制指令,目前已知已經有上千種計算機語言,人們是通過計算機語言寫的程序,給計算機下達指令,讓計算機工作的。
其中,C語言就是眾多計算機語言中的?種,當然C++/Java/Go/Python都是計算機語言。
1.1 C語言的歷史
既然要學C語言,我們就要知道C語言是怎么來的.
其實,C語言最初是作為Unix系統的開發工具而發明的。
我們在鏈接:https://www.tiobe.com/tiobe-index/也能看到C語言是很受歡迎的語言
二. 開發環境
編譯型語言和解釋型語言
對于 CPU 而言,編譯型語言 是將源代碼先通過編譯器編譯為 CPU 認識的機器碼(可執行文件),此后 CPU 隨時都可以直接執行編譯后的機器碼;而解釋型語言則不直接編譯成機器碼,而是將源碼轉換成中間代碼,然后發送給解釋器,由解釋器逐句翻譯給 CPU 來執行。
2.1 編譯和鏈接
我們要知道,C語言是一門編譯型計算機語言,而實際上C語言源代碼都是文本文件,文本文件本身是無法執行的,必須通過編譯器翻譯和鏈接器的鏈接,然后生成二進制的可執行文件,最終才能夠執行。
所以我們知道了,要得到最終運行的可執行程序,中間必須要經過編譯和鏈接兩個過程。
?個工程一般都會有多個源文件組成
C語言代碼是放在 .c 為后綴的文件中的
注:
1. 每個源文件(.c)單獨經過編譯器處理生成對應的目標文件(.obj為后綴的文件)
2. 多個目標文件和庫文件經過鏈接器處理生成對應的可執行程序(.exe文件)
注意:在 Linux 系統上用 C 語言編譯的可執行程序,不能在 Windows系統上執行,因為可執行文件在執行之前,操作系統要有一些準備工作,因為不同的操作系統,準備工作是不同的,所以可執行文件的格式不完全相同。比Windows 上大部分可執行文件為 PE 格式,而 Linux 上大部分可執行文件為 ELF格式。格式不同導致了不同的可執行文件無法跨平臺直接使用
2.2 編譯器的選擇
C語言是一門編譯型的計算機語言,需要依賴編譯器將計算機語言轉換成機器能夠執行的機器指令。
那我們常見的C語言編譯器都有哪些呢?
比如:msvc、clang、gcc 就是?些常見的編譯器,當然也有?些集成開發環境 如:VS2022、XCode、CodeBlocks、DevC++、Clion 等。
集成開發環境(IDE)用于提供程序開發環境的應用程序,一般包括代碼編輯器、 編譯器 、 調試器和圖形用戶界面等工具。
集成了代碼編寫功能、分析功能、編譯功能、調試功能等?體化的開發軟件服務套。(集成開發環境不能直接稱作編譯器,集成開發環境中集成了編譯器)
我們最常見到的編譯器一般是VS2022和DevC++,而我比較推薦初學者使用VS2022,因為它上手容易,默認界面為中文,對新手友好,可以等到后面再熟悉DevC++
2.2.1 VS項目和源文件、頭文件介紹
在VS上寫代碼,我們是需要創建項目的,直接新建項目就可以了。
在項目中就可以添加源文件和頭文件。
C語言把 .c 為后綴的文件稱為源文件,把 .h 為后綴的文件稱為頭文件,h的意思是header的意思。
2.2.2在VS創建項目
首先創建新項目
選擇空項目,接著下一步
項目名稱不能寫中文,也不要有特殊字符 項目可以放在你想放的地方,但路徑上最好不要有中文,也不要有特殊字符
創建好之后,首先打開解決方案資源管理器(一般是默認有打開的,如果有打開的話就不用管)
創建項目后,右擊源文件————添加————新建項
選擇第一個,接著把cpp后綴改成c,然后添加
如果點進去是這種界面最好打開顯示所有模板(至于為啥后面的學習會講到)
這樣就創建好啦!后面會寫一篇關于VS的快捷鍵和調試技巧,方便大家更好的使用VS
三、第一個C語言程序
這里演示VS2022中創建項目和編寫C代碼的過程,并運行出結果。
在VS2022上運行代碼的快捷鍵:Ctrl+f5
四、main函數
每個 C 語言程序不管有多少行代碼,都是從 main 函數開始執行的
main 函數是程序的入口
main 函數也被叫做:主函數。
main 前面的 int 表示 main 函數執行結束的時候返回?個整型類型的值。所以在 main 函數的最后寫 return 0; 正好前后呼應。
總結一下:
? main函數是程序的入口
? main函數有且僅有一個
? 即使一個項目中有多個.c文件,但是只能有一個main函數(因為程序的入口只能有?個)
第一次寫代碼,一些常見的錯誤總結:
? main 被寫成了mian
? main后邊的()漏掉了
? 代碼中不能使用中文符號,比如括號和分號
? 一條語句結束后,有分號
五、printf和庫函數
在上面的代碼中有?句代碼如下:
代碼中使用了 printf 函數,實現了在屏幕上的信息的打印。
這里簡單的介紹?下 printf , printf 是?個庫函數,它的功能是在標準輸出設備(?般指屏幕)上進行信息的打印。上面的代碼是使用 printf 函數打印字符串。只要把想要打印的一串字符放在雙引號中并傳遞給printf函數就可以打印。
printf函數也可以用來打印其他類型的數據,比如:
int n = 100;
printf("%d\n", n); //printf打印整型
printf("%c\n", 'q'); //printf打印字符
printf("%lf\n", 3.14); //printf打印雙精度浮點型
這里的 %d , %c 等是占位符,會被后邊的值替換。(后期會有講解)
同時我們在使用庫函數的時候,是需要包含頭文件的,比如: printf 函數需要包含的就是stdio.h 這個頭文件,具體的方法就是:
#include <stdio.h>
5.1什么是庫函數呢
由來稍微了解就行,需要記的是后面用到的采用庫函數,慢慢積累即可
那什么是庫函數呢?
為了提升開發效率,也為了不再重復實現常見的代碼,于是C語言標準規定了?組函數,這些函數再由不同的編譯器廠商根據標準進行實現,提供給程序員使用。這些函數組成了一個函數庫,被稱為標準庫(后面學習函數時會講到),這些函數也被稱為庫函數。在這個基礎上一些編譯器廠商可能會額外擴展提供部分函數(這些函數其他編譯器不一定支持)。
?個系列的庫函數一般會聲明在同一個頭文件中,所以庫函數的使用,要包含對應的頭文件。
庫函數比較多,后期慢慢來介紹,提前了解可參考鏈接:https://cplusplus.com/reference/clibrary/
六、關鍵字介紹
C語言中有一批保留的名字的符號,比如: int 、 if 、 return ,這些符號被稱為保留字或者關鍵字。
? 關鍵字都有特殊的意義,是保留給C語言使用的
? 程序員自己在創建標識符的時候是不能和關鍵字重復的
? 關鍵字也是不能自己創建的。
C語言的32個關鍵字如下:
auto break case char const continue default do double else enum
extern
float for goto if int long register return short signed sizeofstatic
struct switch typedef union unsigned void volatile while
千萬不能一口氣背下來,千萬不能一口氣背下來,千萬不能一口氣背下來,后面學習到再理解記下即可
注:在C99標準中加入了 inline 、 restrict 、 _Bool 、 _Complex 、 _Imaginary 等關鍵字。
一些關鍵字大家可以去了解?下,不過使用最多的還是上面的32個關鍵字。
注:https://zh.cppreference.com/w/c/keyword(C語言關鍵字的全部介紹)
后期學習到會慢慢介紹這些常用的關鍵字的
七、字符和ASCII編碼
在鍵盤上可以敲出各種字符,如:a,q,@,#等,這些符號都被稱為字符,C語言中字符是用單引號括起來的,如:‘a’,‘b’,‘@’。
我們知道在計算機中所有的數據都是以二進制的形式存儲的,那這些字符在內存中分別以什么樣的二進制存儲的呢?如果我們每個人自己給這些字符中的每個字符編一個二進制序列,這個叫做編碼,為了了便大家相互通信,不造成混亂,后來美國國家標準學會(ANSI)出臺了?個標準 ASCII 編碼,C語言中的字符就遵循了 ASCII 編碼的方式。
參考:https://zh.cppreference.com/w/cpp/language/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 這32個字符是不可打印字符,無法打印在屏幕上觀察
八、字符串和\0
C語言中如何表示字符串呢?使用雙引號括起來的一串字符就被稱為字符串,如:“abcdef”,就是一個字符串。
字符串的打印格式可以使用%s來指定,也可以直接打印如下:
C語言字符串中一個特殊的知識,就是
字符串的末尾隱藏放著?個 \0 字符
\0 字符是字符串的結束標志。
對于字符串"abcdef",我們實際上看到了6個字符:a,b,c,d,e,f,但是實際上在末尾還隱藏一個 \0 的轉義字符, \0 是字符串的結束標志。所以我們在使用庫函數 printf() 打印字符串或者strlen() 計算字符串長度的時候,遇到 \0 的時候就自動停止了。
C語言中也可以把?個字符串放在?個字符數組(數組后面會學到,現在稍微能夠了解\0的功能就行)中,我們在這里利用下面的代碼驗證?下 \0 的功能。
我們可以看到, arr1 字符數組在打印的時候,打印了 a 、 b 、 c 后還打印了一些隨機值,這就是因為 arr1 在末尾的地方沒有 \0 字符作為結束標志,在打印的時候沒有停止。
但是 arr2 的打印就是完全正常的,就是因為 arr2 數組是使用字符串常量初始化的,數組中有 \0作為技術標志,打印可以正常停止。
如果我們在arr1數組中單獨放?個 ‘\0’ 字符會怎么樣呢?
看到三次打印的結果是?樣的了,都是打印到 \0 的時候就停止了,那從上述的例子我們確實能夠觀察到 \0 的作用和重要性的。
九、轉義字符
也許在前面的代碼中你看到 \n , \0 會很疑惑是啥?其實在字符中有一組特殊的字符是轉義字符,轉義字符顧名思義:轉變原來的意思的字符。
比如:我們有字符 n ,在字符串中打印的時候自然能打印出這個字符,如下:
#include <stdio.h>
int main()
{printf("abcndef");return 0;
}
運行結果
如果我們修改?下代碼,在 n 的前面加上 \ ,變成如下代碼:
#include <stdio.h>
int main()
{printf("abc\ndef");return 0;
}
運行結果
我們可以看到修改的前后代碼輸出的結果,截然不同的,那這是為什么呢?
這就是轉義字符的問題, \n 是一個轉義字符表示換行的意思,我們可以簡單的理解為 \ 讓 n 的意思
發生了轉變, n 本來是?個普通的字符,被 \ 轉義為換行的意思。
C語言中像這樣的轉義字符還有一些,具體如下:
? ? :在書寫連續多個問號時使用,防止他們被解析成三字母詞,在新的編譯器上沒法驗證了。
?
’ :用于表示字符常量’
? " :用于表示?個字符串內部的雙引號
? \ :用于表示?個反斜杠,防止它被解釋為?個轉義序列符。
?
\a :警報,這會使得終端發出警報聲或出現閃爍,或者兩者同時發生。
? \b :退格鍵,光標回退一個字符,但不刪除字符。
? \f
:換頁符,光標移到下一頁。在現代系統上,這已經反映不出來了,行為改成類似于 \v 。
? \n :換行符。
? \r:回車符,光標移到同一行的開頭。
? \t :制表符,光標移到下一個水平制表位,通常是下?個4/8的倍數。
? \v:垂直分隔符,光標移到下?個垂直制表位,通常是下?行的同一列。
下面2種轉義字符可以理解為:字符的8進制或者16進制表示形式
? \ddd:d d d表示1~3個八進制的數字。 如: \130 表示字符X
? \xdd :d d表示2個十六進制數字。 如: \x30 表示字符0
\0 :null 字符,代表沒有內容, \0 就是 \ddd 這類轉義字符的?種,用于字符串的結束標志,其ASCII碼值是0.
代碼演示:
#include<stdio.h>
int main()
{printf("%c\n", '\''); //表示單引號printf("%s\n", "\""); //表示雙引號printf("c:\\test\\code\\test.c\n");//反斜杠printf("\a");//警報或閃爍printf("%c\n", '\130'); //130是8進制,轉換成10進制是88,以88作為ASCII碼值的字符是'X'printf("%c\n", '\x30'); //x30中的30是16進制,轉換成10進制是48,以48作為ASCII碼值的字符是'0return 0;
}
運行結果:
這些ASCII碼值是可以自己寫代碼驗證的,大家也可以自己驗證。
關于轉義字符我們首先要了解,然后要能在字符串中識別出來。
十、語句和語句分類
C語言的代碼是由一條一條的語句構成的,C語言中的語句可為以下五類:
10.1 空語句
空語句是最簡單的,一個分號就是一條語句,是空語句。
代碼演示:
#include <stdio.h>
int main()
{;//空語句return 0;
}
空語句,一般出現的地方是:這里需要一條語句,但是這個語句不需要做任何事,就可以寫一個空語句。
10.2 表達式語句
表達式語句就是在表達式的后邊加上分號。如下所示:
#include <stdio.h>
int main()
{int a = 20;int b = 0;b = a + 5; //表達式語句return 0;
}
10.3 函數調用語句
函數調用的時候,也會加上分號,就是函數調用語句。
#include <stdio.h>
int Add(int x, int y)
{return x+y;
}
int main()
{printf("hehe\n");//函數調?語句int ret = Add(2, 3);//函數調?語句 return 0;
}
10.4 復合語句
復合語句其實就是前面講過的代碼塊,成對括號中的代碼就構成一個代碼塊,也被稱為復合語句。
#include <stdio.h>
void print(int arr[], int sz) //函數的大括號中的代碼也構成復合語句
{int i = 0;for(i=0; i<sz; i++){printf("%d ", arr[i]);}
}
int main()
{int i = 0;int arr[10] = {0};for(i=0; i<10; i++) //for循環的循環體的大括號中的就是復合語句{arr[i] = 10-i;printf("%d\n", arr[i]);}return 0;
}
10.5 控制語句
控制語句用于控制程序的執行流程,以實現程序的各種結構方式(C語言支持三種結構:順序結構、選擇結構、循環結構),它們由特定的語句定義符組成,C語言有九種控制語句。
可分成以下三類:
- 條件判斷語句也叫分支語句:if語句、switch語句;
- 循環執行語句:do while語句、while語句、for語句;
- 轉向語句:break語句、go to語句、continue語句、return語句。
下一期會給大家??介紹控制語句。
十一、注釋
注釋是對代碼的說明,編譯器會忽略注釋,也就是說,注釋對實際代碼沒有影響。
注釋是給程序員自己,或者其他程序員看的。
好的注釋可以幫我們更好的理解代碼,但是也不要過度注釋,不要寫沒必要的注釋。
當然不寫注釋可能會讓后期閱讀代碼的人抓狂,哈哈哈
11.1注釋的兩種形式
11.1.1/**/形式
第一種方法是將注釋放在 /…/ 之間,內部可以分行。
/* 注釋 */
/*這是一行注釋
*/
這種注釋可以插在行內。
注意:
/**/ 的這個注釋不支持嵌套注釋, /* 開始注釋后,遇到第?個 */ 就認為注釋結束了。
11.1.2//形式
第而種寫法是將注釋放在雙斜杠 // 后面,從雙斜杠到行尾都屬于注釋。這種注釋只能是單行,可以放在行首,也可以放在一行語句的結尾。這是 C99 標準新增的語法。
不管是哪一種注釋,都不能放在雙引號里面。
雙引號里面的注釋符號,會成為字符串的一部分,解釋為普通符號,失去注釋作用。
printf("// hello /* world */ ");
上面示例中,雙引號里面的注釋符號,都會被視為普通字符,沒有注釋作用。
11.2 注釋會被替換
編譯時,注釋會被替換成一個空格,所以 min/* 這里是注釋*/Value 會變成 min Value ,而不是 minValue 。
十二、結尾
這一課的內容就到這里了,下節課開始正式學習C語言的數據類型和變量
如果內容有什么問題的話歡迎指正,有什么問題也可以問我!