目錄
一、什么是C語言?
二、C語言的歷史與成就
三、編譯器選擇(VS2022)
1、編譯與鏈接
2、編譯器對比
3、VS2022的優缺點
四、VS項目與源文件、頭文件介紹
五、第一個C語言程序
六、main函數
七、printf和庫函數
八、關鍵字介紹
九、字符與ASCII編碼
十、字符串與空字符
十一、轉義字符
十二、語句和語句分類
1、空語句
2、表達式語句
3、函數調用語句
4、復合語句
5、控制語句
十三、注釋是什么?為什么要寫注釋?
1、注釋的兩種形式
/* */形式
雙斜杠//
2、注釋替換規則
十四、VS2022創建項目步驟
第一步:點擊創建新項目
第二步:選擇空項目,然后下一步
第三步:填寫項目名稱和路徑
第四步:項目創建完成
第五步: 新建源文件過程
第六步:顯示所有模版并成功新建.c源文件
一、什么是C語言?
- 人與人交流使用的是自然語言,比如漢語、英語、日語等。
- 那么人與計算機如何溝通呢?答案是通過計算機語言。
- 目前已知的計算機語言已有上千種。人們通過編寫計算機程序來給計算機下達指令,使其完成特定工作。
- C語言就是眾多計算機語言中的一種,其他常見的還有C++、Java、Go、Python等。
二、C語言的歷史與成就
C語言最初是為開發Unix操作系統而發明的工具。
摘要:TIOBE 指數 - TIOBE
2025 年 6 月的 TIOBE 指數:
????????TIOBE 編程社區指數是衡量編程受歡迎程度的指標 語言。該指數每月更新一次。評級基于 全球技術嫻熟的工程師、課程和第三方供應商。熱門網站 Google、Amazon、Wikipedia、Bing 和其他 20 多個網站用于計算評級。 需要注意的是,TIOBE 指數并不是關于最好的編程語言或語言 其中編寫了大部分代碼行。
????????該索引可用于檢查您的編程技能是否仍然是最新的,或者創建 關于在開始構建新的 軟件系統。TIOBE 指數的定義可以在這里找到。
?
?
三、編譯器選擇(VS2022)
1、編譯與鏈接
- C語言作為一門編譯型計算機語言,其源代碼以文本文件形式存在。
- 這些文本文件本身不可直接執行,需要通過編譯器進行翻譯并由鏈接器完成鏈接,最終生成二進制可執行文件才能運行。
- C語言代碼通常存儲在以.c為后綴的文件中。要將其轉換為可執行程序,需要經過編譯和鏈接兩個關鍵步驟。
一個工程通常由多個源文件組成。下圖展示了源程序經過編譯器和鏈接器處理的過程:
注意:
-
編譯器將每個源文件(.c)單獨編譯,生成對應的目標文件(.obj后綴文件)
-
鏈接器將多個目標文件與庫文件組合,最終生成可執行程序(.exe文件)
這就是Windows系統下C語言程序生成.exe可執行文件的完整流程。
2、編譯器對比
- C語言是一門編譯型計算機語言,需要通過編譯器將源代碼轉換為機器可執行的指令。
- 常見的C語言編譯器包括msvc、clang和gcc等。
- 此外,還有一些集成開發環境(IDE)如VS2022、XCode、CodeBlocks、DevC++和Clion等,它們內置了這些編譯器。
- 集成開發環境(IDE)是為程序開發提供完整環境的應用程序,通常包含代碼編輯器、編譯器、調試器和圖形用戶界面等工具。
- 這些IDE整合了代碼編寫、分析、編譯和調試等功能,提供了一整套開發軟件服務。
- VS2022:集成MSVC編譯器(安裝包較大但安裝簡便,無需額外配置,使用便捷)(Visual Studio 2022 IDE - 適用于軟件開發人員的編程工具)
- XCode:蘋果電腦專用開發工具,內置clang編譯器(Xcode - Apple Developer)
- CodeBlocks:集成gcc編譯器(相對小眾,需配置環境,不推薦使用)(Code::Blocks - Code::Blocks)
- DevC++:輕量級gcc集成工具(界面過于簡單,不利于代碼風格養成,常見于競賽場景)(Dev-C++ download | SourceForge.net)
- Clion:默認采用CMake構建系統,可配置編譯器(付費軟件,暫不推薦)(CLion:JetBrains 的 C 和 C++ 跨平臺 IDE)
綜合推薦:建議安裝VS2022社區版(免費、操作簡便、行業主流工具)
📎 VS2022安裝教程:VS2022安裝使用教程,VS2022使用教程Visual Studio 2022詳細安裝使用調試教程C語言編譯器C++編譯器VS2022使用教程C語言軟件安裝_嗶哩嗶哩_bilibili
3、VS2022的優缺點
優點:
- 作為主流集成開發環境,VS2022在企業中應用廣泛
- 集編輯器、編譯器和調試器于一體,功能全面
- 安裝即用,基本無需額外配置,易于上手
- 默認中文界面,對初學者十分友好
缺點:
- 功能豐富導致安裝包較大,占用較多存儲空間
四、VS項目與源文件、頭文件介紹
????????在VS中進行開發時,需要先創建項目(直接新建項目即可)。項目創建后,可添加源文件和頭文件,C語言把:
- 源文件:以.c為后綴
- 頭文件:以.h為后綴
五、第一個C語言程序
#include <stdio.h>int main()
{printf("hello C\n");return 0;
}
在VS2022中創建項目、編寫C代碼并運行:
在VS2022中運行代碼的快捷鍵是:Ctrl+F5。
六、main函數
- 任何C語言程序都從main函數開始執行,無論代碼量有多少。
- main函數是程序的唯一入口,也被稱為主函數。
- 函數前的int表明main函數執行完畢后會返回一個整型值,因此在函數末尾使用"return 0;"與之呼應。
關于main函數的關鍵點:
- 程序有且僅有一個main函數
- 即使項目包含多個.c文件,也只能有一個main函數(程序入口唯一)
初學者常見錯誤:
- 將main誤寫為mian
- 遺漏main后面的括號()
- 使用中文符號(如括號、分號)
- 語句結尾未加分號
七、printf和庫函數
在上文示例代碼中,我們使用了printf函數:
printf("hello C\n");
????????printf是一個標準庫函數,用于在標準輸出設備(通常是屏幕)上顯示信息。使用時只需將需要輸出的字符串用雙引號括起來作為參數傳入即可。
printf不僅能輸出字符串,還可以打印多種數據類型:
int n = 100;
printf("%d\n", n); // 打印整型
printf("%c\n", 'q'); // 打印字符
printf("%lf\n", 3.14);// 打印雙精度浮點型
其中%d、%c等是格式占位符,將被后續的實際值替代(后續會詳細講解)。
使用庫函數時需要包含相應頭文件,例如printf需要:
#include <stdio.h>
關于庫函數:
????????C語言標準定義了一組常用函數的規范,由編譯器廠商實現并提供給開發者使用,這些函數統稱為標準庫函數,這些函數組成了?個函數庫,被稱為標準庫,某些編譯器廠商可能還會提供額外的擴展函數(不一定被其他編譯器支持)。
同類型的庫函數通常聲明在同一個頭文件中,因此使用時需要包含對應的頭文件。
更多庫函數信息可參考:cplusplus.com/reference/clibrary/
八、關鍵字介紹
????????C語言中有一組具有特殊含義的保留符號,如int、if、return等,這些符號被稱為關鍵字或保留字。關鍵字的特性包括:
- 具有特定功能,專為C語言設計
- 不能用作程序員自定義的標識符
- 無法由用戶自行創建
C語言包含32個基本關鍵字:
補充說明:
- C99標準新增了inline、restrict、_Bool、_Complex、_Imaginary等關鍵字
- 實際開發中最常用的仍是上述32個基礎關鍵字
- 完整關鍵字說明可參考:C keywords - cppreference.com
這些常用關鍵字將在后續中逐步講解。
九、字符與ASCII編碼
????????在鍵盤上輸入的各種符號(如a、q、@、#等)都被稱為字符。在C語言中,字符需要用單引號括起來表示,例如'a'、'b'、'@'等。
????????由于計算機中的所有數據都以二進制形式存儲,這些字符在內存中也需要對應的二進制表示。如果每個人都自行定義字符的二進制編碼,就會造成通信混亂。為此,美國國家標準學會(ANSI)制定了統一的ASCII編碼標準。C語言中的字符編碼正是遵循了這一標準。
以下是ASCII編碼表:?ASCII Chart - cppreference.com
雖然不需要記憶整個ASCII碼表,但掌握幾組關鍵數據會很有幫助:
- 大寫字母A-Z對應65-90
- 小寫字母a-z對應97-122
- 大小寫字母的ASCII差值恒為32(如'A'與'a')
- 數字0-9對應48-57
- 換行符\n的ASCII值為10
- 0-31為不可打印的控制字符,無法打印在屏幕上觀察
單個字符的打印可以使用%c來指定格式:
#include <stdio.h>
int main()
{printf("%c\n", 'Q'); // 直接輸出字符printf("%c\n", 81); // 通過ASCII碼輸出return 0;
}
可打印字符展示(32-126):
#include <stdio.h>
int main()
{for(int i=32; i<127; i++) {printf("%c ", i);if(i%16 == 15) printf("\n");}return 0;
}
十、字符串與空字符
????????在C語言中,字符串是通過雙引號括起來的一串字符來表示的。例如:"abcdef"就是一個字符串。字符串的打印可以使用%s格式符,也可以直接輸出:
#include <stdio.h>
int main()
{printf("%s\n", "hello C");printf("hello c");return 0;
}
????????C語言字符串有一個重要特性:每個字符串末尾會自動包含一個隱藏的'\0'字符,這個空字符標志著字符串的結束。
觀察VS2022的監視窗口:
????????在字符串"abcdef"中,我們直觀看到的是6個字符:a、b、c、d、e、f。但實際上字符串末尾還包含一個隱藏的轉義字符\0,它是字符串的結束標志。正是因為這個特性,當使用庫函數如printf()打印字符串或strlen()計算字符串長度時,遇到\0就會自動停止操作。
在C語言中,字符串也可以存儲在字符數組中。下面通過代碼演示\0的作用:
#include <stdio.h>
int main()
{char arr1[] = {'a', 'b', 'c'}; // arr1數組僅存儲3個字符char arr2[] = "abc"; // arr2數組存儲字符串printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}
調試時可以發現arr1和arr2的內容差異:
運行結果:
????????當打印 arr1 字符數組時,輸出完 a、b、c 后會出現隨機值,這是因為 arr1 末尾缺少 \0 作為結束標志,導致無法正常終止,直到找到\0為止。而 arr2 數組使用字符串常量初始化時自動包含 \0 標志,因此打印能正常停止。
如果在 arr1 數組中手動添加 \0 字符會怎樣呢?
#include <stdio.h>
int main()
{char arr1[] = {'a', 'b', 'c', '\0'};char arr2[] = "abc";printf("%s\n", arr1);printf("%s\n", arr2);printf("%s\n", "abc\0def");return 0;
}
從三次打印結果可以看出,輸出都在遇到 '\0' 時終止。這個例子清楚地展示了 '\0' 的重要作用。
十一、轉義字符
????????在前面的代碼中,你可能遇到過 \n
和 \0
這樣的特殊符號。這些都屬于轉義字符,顧名思義就是能夠改變字符原本含義的特殊字符。舉個簡單例子,字符 'n' 在字符串中會正常顯示,但當我們使用 \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 語言中,類似的轉義字符還有以下幾種:
轉義字符 | 說明 | 示例/備注 |
---|---|---|
\n | 換行符 | 光標移動到下一行行首 |
\? | 連續問號轉義 | 防止被解析為三字母詞(現代編譯器基本不需要) |
\' | 單引號字符 | 用于字符常量中:char c = '\''; |
\" | 雙引號字符 | 用于字符串內部:"He said, \"Hello\"" |
\\ | 反斜杠字符 | 表示路徑時:"C:\\Windows\\System" |
\a | 警報符 | 觸發系統提示音或閃爍(ASCII 7) |
\b | 退格符 | 光標回退一格(ASCII 8),不刪除內容 |
\f | 換頁符 | 原始設計用于打印機換頁,現代終端行為類似\v |
\r | 回車符 | 光標返回行首(常用于Windows換行\r\n ) |
\t | 水平制表符 | 跳到下一個制表位(通常4/8字符間隔) |
\v | 垂直制表符 | 光標移動到下一行同列位置 |
有兩種轉義字符可以理解為字符的八進制或十六進制表示形式:
\ddd
:由1-3位八進制數字組成。例如:\130
表示字符X\xdd
:由2位十六進制數字組成。例如:\x30
表示字符0
其中,\0
表示null字符,代表空內容。它屬于\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碼值的字符是'0'return 0;
}
- 這些ASCII碼值可以通過編寫代碼自行驗證
- 我們需要理解轉義字符的概念,并能在字符串中正確識別
- 轉義字符參考文檔:Escape sequences - cppreference.com
十二、語句和語句分類
C語言代碼由一系列語句構成,可分為以下五類:
- 空語句
- 表達式語句
- 函數調用語句
- 復合語句
- 控制語句
1、空語句
空語句是最簡單的語句形式,僅由一個分號構成。
#include <stdio.h>
int main()
{; //空語句return 0;
}
?空語句通常用于需要語句但不執行任何操作的場景。
2、表達式語句
表達式語句是在表達式末尾加上分號形成的語句。
#include <stdio.h>
int main()
{int a = 20;int b = 0;b = a + 5; //表達式語句return 0;
}
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;
}
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++) { //循環體構成復合語句arr[i] = 10-i;printf("%d\n", arr[i]);}return 0;
}
5、控制語句
????????控制語句用于控制程序執行流程,實現程序的不同結構(順序結構、選擇結構、循環結構)。C語言共有9種控制語句,可分為三類:
- 條件判斷語句(分支語句):if語句、switch語句;
- 循環執行語句:do-while語句、while語句、for語句;
- 轉向語句:break語句、goto語句、continue語句、return語句。
后續章節將詳細介紹這些控制語句。
十三、注釋是什么?為什么要寫注釋?
????????注釋是對代碼的解釋說明,編譯器會忽略這部分內容,因此注釋不會影響代碼的實際運行。其主要目的是幫助程序員(包括自己和其他開發者)更好地理解代碼。
????????優秀的注釋應當簡明扼要,既不能過度注釋(避免寫無意義的說明),也不能完全不寫(否則會給后續代碼維護帶來困難)。適當地添加必要注釋不僅能體現開發者的專業素養,在求職面試時,規范的注釋習慣也會給面試官留下良好印象。
VS2022注釋與去注釋快捷鍵如下:
1、注釋的兩種形式
C語言支持兩種注釋方式:
/* */形式
這種注釋可以跨越多行,格式如下:
/* 單行注釋 */
/*
多行
注釋
*/
也可用于行內注釋:
int fopen(char* s /* 文件名 */, int mode);
????????在上面的示例中,/* file name */
用于說明函數參數,后續代碼仍然會正常執行。需要注意的是:這種注釋必須包含結束符號*/
,否則可能導致錯誤。
printf("a "); /* 注釋一
printf("b ");
printf("c "); /* 注釋二 */
printf("d ");
????????本示例中,原意是在第一行和第三行代碼尾部各有一個注釋。但由于第一行注釋漏寫了結束符號,導致注釋一的范圍一直延續到第三行結束(觀察代碼中高亮與不高亮的部分)。
注意事項:
- 必須成對使用
/*
和*/
,否則會導致注釋范圍錯誤 - 不支持嵌套注釋,遇到第一個
*/
就會結束注釋塊 - 編譯時注釋會被替換為一個空格,例如
min/*注釋*/Value
會變成min Value
雙斜杠//
????????第二種方式是使用雙斜杠//進行注釋,從//開始到行尾的內容都屬于注釋。這種注釋僅限于單行,既可以獨立成行,也可以跟在代碼語句后面。這是C99標準新增的語法。
示例:
// 這是單行注釋
int x = 1; // 語句后的注釋
????????需要注意的是,所有類型的注釋都不能出現在雙引號內。雙引號內的注釋符號會被視為字符串的一部分,失去注釋功能。
示例:(觀察代碼中高亮部分,代碼中并無不高亮部分,意思是注釋不起作用)
printf("// hello /* world */ ");
上述示例中,雙引號內的所有注釋符號都被當作普通字符處理。
2、注釋替換規則
編譯器會將注釋替換為一個空格。例如:
min/* 注釋 */Value
將被處理為min Value
,而不是minValue
。?
十四、VS2022創建項目步驟
第一步:點擊創建新項目
第二步:選擇空項目,然后下一步
第三步:填寫項目名稱和路徑
第四步:項目創建完成
如果沒有左邊方框的內容就點擊視圖找到解決方案資源管理器:
第五步: 新建源文件過程
第六步:顯示所有模版并成功新建.c源文件
小知識:C++叫c plus plus或者cpp;C++代碼的文件后綴是.cpp
?