長文 | C語言從入門到精通保姆級教程(上)
[導讀]點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!來源:代碼情緣哈嘍,大家好,我是瓜哥,致力于為大家分享互聯(lián)網(wǎng)各領域干貨。這篇文章可以說是一本書了,排版,碼字耗費了瓜哥很長的時間,10W字C語言從入門到精通保姆級教程2021年版,覺得有價值記得一鍵三連支持。目錄...
點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!
來源:代碼情緣哈嘍,大家好,我是瓜哥,致力于為大家分享互聯(lián)網(wǎng)各領域干貨。這篇文章可以說是一本書了,排版,碼字耗費了瓜哥很長的時間,
10W 字 C 語言從入門到精通保姆級教程2021年版
,覺得有價值記得一鍵三連
支持。目錄
- 計算機常識
- 什么是計算機程序?
- 什么是計算機語言 ?
- 常見的計算機語言類型有哪些?
- 什么是C語言?
- C語言歷史
- C語言標準
- C語言現(xiàn)狀
- 為什么要學習C語言?
- 如何學好C語言
- 工欲善其事必先利其器
- 編寫C語言程序用什么工具 ?
- 什么是Qt Creator ?
- Qt Creator安裝
- 什么是環(huán)境變量?
- 為什么要配置系統(tǒng)變量,不配置用戶變量
- Qt Creator快捷鍵
- 如何創(chuàng)建C語言程序
- 如何創(chuàng)建C語言文件
- C語言程序組成
- 函數(shù)定義格式
- 如何執(zhí)行定義好的函數(shù)
- 如何運行編寫好的程序
- main函數(shù)注意點及其它寫法
- C語言程序練習
- 初學者如何避免程序出現(xiàn)BUG
- 多語言對比
- 什么是注釋?
- 為什么要使用注釋?
- 注釋的分類
- 注釋的注意點
- 注釋的應用場景
- 使用注釋的好處
- 什么是關鍵字?
- 關鍵字分類
- 什么是標識符?
- 標識符命名規(guī)則
- 練習
- 標識符命名規(guī)范
- 什么是數(shù)據(jù)?
- 數(shù)據(jù)分類
- C語言數(shù)據(jù)類型
- 什么是常量?
- 常量的類型
- 什么是變量?
- 如何定義變量
- 如何使用變量?
- 變量的初始化
- 如何修改變量值?
- 變量之間的值傳遞
- 如何查看變量的值?
- 變量的作用域
- 變量內存分析(簡單版)
- printf函數(shù)
- Scanf函數(shù)
- scanf運行原理
- putchar和getchar
- 運算符基本概念
- 運算符分類
- 運算符的優(yōu)先級和結合性
- 算數(shù)運算符
- 賦值運算符
- 自增自減運算符
- sizeof運算符
- 逗號運算符
- 關系運算符
- 邏輯運算符
- 三目運算符
- 類型轉換
- 階段練習
- 流程控制基本概念
- 選擇結構
- 選擇結構if
- 選擇結構switch
- 循環(huán)結構
- 循環(huán)結構while
- 循環(huán)結構do while
- 循環(huán)結構for
- 四大跳轉
- 循環(huán)的嵌套
- 圖形打印
- 函數(shù)基本概念
- 函數(shù)的分類
- 函數(shù)的定義
- 函數(shù)的參數(shù)和返回值
- 函數(shù)的聲明
- main函數(shù)分析
- 遞歸函數(shù)(了解)
- 進制基本概念
- 進制轉換
- 十進制小數(shù)轉換為二進制小數(shù)
- 二進制小數(shù)轉換為十進制小數(shù)
- 原碼反碼補碼
- 位運算符
- 變量內存分析
- char類型內存存儲細節(jié)
- 類型說明符
- short和long
- signed和unsigned
- 數(shù)組的基本概念
- 定義數(shù)組
- 初始化數(shù)組
- 數(shù)組的使用
- 數(shù)組的遍歷
- 數(shù)組長度計算方法
- 練習
- 數(shù)組內部存儲細節(jié)
- 數(shù)組的越界問題
- 數(shù)組注意事項
- 數(shù)組和函數(shù)
- 數(shù)組元素作為函數(shù)參數(shù)
- 數(shù)組名作為函數(shù)參數(shù)
- 數(shù)組名作函數(shù)參數(shù)的注意點
- 計數(shù)排序(Counting Sort)
- 選擇排序
- 冒泡排序
- 插入排序
- 希爾排序
- 折半查找
- 進制轉換(查表法)
- 二維數(shù)組
- 二維數(shù)組的定義
- 二維數(shù)組的初始化
- 二維數(shù)組的應用場景
- 二維數(shù)組的遍歷和存儲
- 二維數(shù)組的遍歷
- 二維數(shù)組的存儲
- 二維數(shù)組與函數(shù)
- 二維數(shù)組作為函數(shù)參數(shù)注意點
- 作業(yè)
- 字符串的基本概念
- 字符串的初始化
- 字符串輸出
- 字符串常用方法
- 練習
- 字符串數(shù)組基本概念
- 指針基本概念
- 什么是指針
- 什么是指針變量
- 定義指針變量的格式
- 指針變量的初始化方法
- 訪問指針所指向的存儲空間
- 指針類型
- 二級指針
- 練習
- 指針訪問數(shù)組元素
- 指針與字符串
- 指向函數(shù)指針
- 什么是結構體
- 定義結構體類型
- 定義結構體變量
- 結構體成員訪問
- 結構體變量的初始化
- 結構體類型作用域
- 結構體數(shù)組
- 結構體指針
- 結構體內存分析
- 結構體變量占用存儲空間大小
- 結構體嵌套定義
- 結構體和函數(shù)
- 共用體
- 枚舉
- 全局變量和局部變量
- auto和register關鍵字
- static關鍵字
- extern關鍵字
- static與extern對函數(shù)的作用
- Qt Creator編譯過程做了什么?
- 計算機是運算過程分析
- 預處理指令
- 預處理指令的概念
- 宏定義
- 帶參數(shù)的宏定義
- 條件編譯
- typedef關鍵字
- 宏定義與函數(shù)以及typedef區(qū)別
- const關鍵字
- 如何使用const?
- 內存管理
- 進程空間
- 棧內存(Stack)
- 堆內存(Heap)
- malloc函數(shù)
- free函數(shù)
- calloc函數(shù)
- realloc函數(shù)
- 鏈表
- 靜態(tài)鏈表
- 動態(tài)鏈表
- 動態(tài)鏈表頭插法
- 動態(tài)鏈表尾插法
- 動態(tài)鏈優(yōu)化
- 鏈表銷毀
- 鏈表長度計算
- 鏈表查找
- 鏈表刪除
- 作業(yè)
- 文件基本概念
- 文件的打開和關閉
- 一次讀寫一個字符
- 一次讀寫一行字符
- 一次讀寫一塊數(shù)據(jù)
- 讀寫結構體
- 其它文件操作函數(shù)
計算機常識
- 什么是計算機?
- 顧名思義,就是能夠進行數(shù)據(jù)運算的機器(臺式電腦、筆記本電腦、平板電腦、智能手機)
- 計算機_百度百科
- 計算機的發(fā)明者是誰 ?
- 關于電子計算機的發(fā)明者是誰這一問題,有好幾種答案:
- 1936年英國數(shù)學家圖靈首先提出了一種以程序和輸入數(shù)據(jù)相互作用產(chǎn)生輸出的計算機構想,后人將這種機器命名為通用圖靈計算機
- 1938年克蘭德·楚澤發(fā)明了首臺采用繼電器進行工作的計算機,這臺計算機命名為Z1,但是繼電器是機械式的,并不是完全的電子器材
- 1942年阿坦那索夫和貝利發(fā)明了首臺采用真空管*的計算機,這臺計算機命名為ABC
- 1946年ENIAC誕生,它擁有了今天計算機的主要結構和功能,是通用計算機
現(xiàn)在世界上公認的第一臺現(xiàn)代電子計算機是1946年在美國賓夕法尼亞大學誕生的ENIAC(Electronic Numerical Integrator And Calculator)
- 計算機特點是什么?
- 計算機是一種電器, 所以計算機只能識別兩種狀態(tài), 一種是通電一種是斷電
- 正是因為如此, 最初ENIAC的程序是由很多開關和連接電線來完成的。但是這樣導致改動一次程序要花很長時間(需要人工重新設置很多開關的狀態(tài)和連接線)
- 為了提高效率,工程師們想能不能把程序和數(shù)據(jù)都放在存儲器中, 數(shù)學家馮·諾依曼將這個思想以數(shù)學語言系統(tǒng)闡述,提出了存儲程序計算機模型(這是所謂的馮·諾依曼機)
- 那利用數(shù)學語言如何表示計算機能夠識別的通電和斷電兩種狀態(tài)呢?
- 非常簡單用0和1表示即可
- 所以計算機能識別的所有指令都是由0和1組成的
- 所以計算機中存儲和操作的數(shù)據(jù)也都是由0和1組成的
0和1更準確的是應該是高電平和低電平, 但是這個不用了解, 只需要知道計算機只能識別0和1以及存儲的數(shù)據(jù)都是由0和1組成的即可。
什么是計算機程序?
- 計算機程序是為了告訴計算機"做某件事或解決某個問題"而用"計算機語言編寫的命令集合(語句)
- 只要讓計算機執(zhí)行這個程序,計算機就會自動地、有條不紊地進行工作,計算機的一切操作都是由程序控制的,離開程序,計算機將一事無成
- 現(xiàn)實生活中你如何告訴別人如何做某件事或者解決某個問題?
- 通過人能聽懂的語言: 張三你去樓下幫我買一包煙, 然后順便到快遞箱把我的快遞也帶上來
- 其實我們通過人能聽懂的語言告訴別人做某件事就是在發(fā)送一條條的指令
- 計算機中也一樣, 我們可以通過計算機語言告訴計算機我們想做什么, 每做一件事情就是一條指令, 一條或多條指令的集合我們就稱之為一個計算機程序
什么是計算機語言 ?
- 在日常生活、工作中, 語言是人們交流的工具
- 中國人和中國人交流,使用中文語言
- 美國人和美國人交流,使用英文語言
- 人想要和計算機交流,使用計算機語言
- 可以看出在日常生活、工作中,人們使用的語言種類很多
- 如果一個很牛人可能同時掌握了中文語言和英文語言, 那么想要和這個人交流既可以使用中文語言,也可以使用英文語言
- 計算機其實就是一個很牛的人, 計算機同時掌握了幾十門甚至上百門語言, 所以我們只要使用任何一種計算機已經(jīng)掌握的語言就可以和計算機交流
常見的計算機語言類型有哪些?
- 機器語言
- 所有的代碼里面只有0和1, 0表示不加電,1表示加電(紙帶存儲時 1有孔,0沒孔)
- 優(yōu)點:直接對硬件產(chǎn)生作用,程序的執(zhí)行效率非常非常高
- 缺點:指令又多又難記、可讀性差、無可移植性
- 匯編語言
- 符號化的機器語言,用一個符號(英文單詞、數(shù)字)來代表一條機器指令
- 優(yōu)點:直接對硬件產(chǎn)生作用,程序的執(zhí)行效率非常高、可讀性稍好
- 缺點:符號非常多和難記、無可移植性
- 高級語言
- 非常接近自然語言的高級語言,語法和結構類似于普通英文
- 優(yōu)點:簡單、易用、易于理解、遠離對硬件的直接操作、有可移植性
- 缺點:有些高級語言寫出的程序執(zhí)行效率并不
- 對比(利用3種類型語言編寫1 1)
1 1
MOV AX, 1 ADD AX, 1
10111000 00000001 00000000 00000101 00000001 00000000
- 機器語言
- 匯編語言
- 高級語言
什么是C語言?
- C語言是一種用于和計算機交流的高級語言, 它既具有高級語言的特點,又具有匯編語言的特點
- 非常接近自然語言
- 程序的執(zhí)行效率非常高
- C語言是所有編程語言中的經(jīng)典,很多高級語言都是從C語言中衍生出來的,
- 例如:C 、C#、Object-C、Java、Go等等
- C語言是所有編程語言中的經(jīng)典,很多著名的系統(tǒng)軟件也是C語言編寫的
- 幾乎所有的操作系統(tǒng)都是用C語言編寫的
- 幾乎所有的計算機底層軟件都是用C語言編寫的
- 幾乎所有的編輯器都是C語言編寫的
C語言歷史
- 最早的高級語言:FORTRAN-->ALGOL-->CPL-->BCPL-->C-->C 等
“初,世間無語言,僅電路與連線。及大牛出,天地開,始有 FORTRAN、 LISP、ALGOL 隨之, 乃有萬種語”
- 1963年英國劍橋大學推出了CPL(Combined Programming Langurage)語言。CPL語言在ALGOL 60的基礎上接近硬件一些,但規(guī)模比較大,難以實現(xiàn)
- 1967年英國劍橋大學的 Matin Richards(理查茲)對CPL語言做了簡化,推出了 BCPL (Base Combined Programming Langurage)語言
- 1970年美國貝爾實驗室的 Ken Thompson(肯·湯普遜) 以 BCPL 語言為基礎,又作了進一步的簡化,設計出了很簡單的而且很接近硬件的 B 語言(取BCPL的第一個字母),并用B語言寫出了第一個 UNIX 操作系統(tǒng)。但B語言過于簡單,功能有限
- 1972年至1973年間,貝爾實驗室的 Dennis.Ritchie(丹尼斯·里奇) 在 B語言的基礎上設計出了C語言(取BCPL的第二個字母)。C語言即保持 BCPL 語言和B語言的優(yōu)點(精練、接近硬件),又克服了他們的缺點(過于簡單,數(shù)據(jù)無類型等)
C語言標準
- 1983年美國國家標準局(American National Standards Institute,簡稱ANSI)成立了一個委員會,開始制定C語言標準的工作
- 1989年C語言標準被批準,這個版本的C語言標準通常被稱為ANSI C(C89)
- 1999年,國際標準化組織ISO又對C語言標準進行修訂,在基本保留原C語言特征的基礎上,針對應該的需要,增加了一些功能,命名為C99
- 2011年12月,ANSI采納了ISO/IEC 9899:2011標準。這個標準通常即C11,它是C程序語言的現(xiàn)行標準
C語言現(xiàn)狀
- 年度編程語言
- 該獎項頒發(fā)給了一年中最熱門的編程語言
- 編程語言排行榜查看
為什么要學習C語言?
- 40多年經(jīng)久不衰
- 了解操作系統(tǒng)、編譯原理、數(shù)據(jù)結構與算法等知識的最佳語言
- 了解其它語言底層實現(xiàn)原理必備語言
- 基礎語法與其它高級語言類似,學會C語言之后再學習其它語言事半功倍,且知根知底
當你想了解底層原理時,你才會發(fā)現(xiàn)后悔當初沒有學習C語言 當你想學習一門新的語言時, 你才會發(fā)現(xiàn)后悔當初沒有學習C語言 當你使用一些高級框架、甚至系統(tǒng)框架時發(fā)現(xiàn)提供的API都是C語言編寫的, 你才發(fā)現(xiàn)后悔當初沒有學習C語言 學好數(shù)理化,走遍天下都不拍 學好C語言,再多語言都不怕
如何學好C語言
學習本套課程之前 | 學習本套課程中 | 學習本套課程之后 |
---|---|---|
- 如何達到這樣的效果
工欲善其事必先利其器
編寫C語言程序用什么工具 ?
- 記事本(開發(fā)效率低)
- Vim(初學者入門門檻高)
- VSCode(不喜歡)
- eclipse(不喜歡)
- CLion(深愛, 但收費)
- Xcode(逼格高, 但得有蘋果電腦)
- Qt Creator(開源免費,跨平臺安裝和運行)
什么是Qt Creator ?
- Qt Creator 是一款新的輕量級集成開發(fā)環(huán)境(IDE)。它能夠跨平臺運行,支持的系統(tǒng)包括 Windows、Linux(32 位及 64 位)以及 Mac OS X
- Qt Creator 的設計目標是使開發(fā)人員能夠利用 Qt 這個應用程序框架更加快速及輕易的完成開發(fā)任務
- 開源免費, 簡單易用, 能夠滿足學習需求
集成開發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開發(fā)環(huán)境的應用程序,一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發(fā)軟件服務套。
Qt Creator安裝
- 切記囫圇吞棗, 不要糾結里面的東西都是什么含義, 初學者安裝成功就是一種成功
- 下載Qt Creator離線安裝包:
http://download.qt.io/
- 以管理身份運行離線安裝包
- 下一步,下一步,下一步,等待ing...
- 注意安裝路徑中最好不要出現(xiàn)中文
- 對于初學者而言全選是最簡單的方式(重點!!!)
- 配置Qt Creator開發(fā)環(huán)境變量
你的安裝路徑\5.11.0\mingw53_32\bin 你的安裝路徑\Tools\mingw530_32\bin
- 啟動安裝好的Qt Creator
- 非全選安裝到此為止, 全選安裝繼續(xù)往下看出現(xiàn)這個錯誤, 忽略這個錯誤即可
- 等待安裝完畢之后解決剛才的錯誤找到安裝目錄下的strawberry.msi,雙擊運行
什么是環(huán)境變量?
- 打開我們添加環(huán)境變量的兩個目錄, 不難發(fā)現(xiàn)里面大部分都是.exe的可執(zhí)行程序
- 如果我們不配置環(huán)境變量, 那么每次我們想要使用這些"可執(zhí)行程序"都必須"先找到這些應用程序對應的文件夾"才能使用
- 為了方便我們在電腦上"任何地方"都能夠使用這些"可執(zhí)行程序", 那么我們就必須添加環(huán)境變量, 因為Windows執(zhí)行某個程序的時候, 會先到"環(huán)境變量中Path指定的路徑中"去查找
為什么要配置系統(tǒng)變量,不配置用戶變量
- 用戶變量只針對使用這臺計算機指定用戶
- 一個計算機可以設置多個用戶, 不同的用戶用不同的用戶名和密碼
- 當給計算機設置了多個用戶的時候,啟動計算機的時候就會讓你選擇哪個用戶登錄
- 系統(tǒng)變量針對使用這臺計算機的所有用戶
- 也就是說設置了系統(tǒng)變量, 無論哪個用戶登錄這臺計算機都可以使用你配置好的工具
Qt Creator快捷鍵
- Qt Creator Keyboard Shortcuts(Documentation)[1]
- Qt Creator Keyboard Shortcuts(Wiki)[2]
如何創(chuàng)建C語言程序
- 這個世界上, 幾乎所有程序員入門的第一段代碼都是Hello World.
- 原因是當年C語言的作者Dennis Ritchie(丹尼斯 里奇)在他的名著
中第一次引入, 傳為后世經(jīng)典, 其它語言亦爭相效仿, 以示敬意
如何創(chuàng)建C語言文件
C語言程序組成
- 手機有很多功能, "開機","關機","打電話","發(fā)短信","拍照"等等
- 手機中的每一個功能就相當于C語言程序中的一個程序段(函數(shù))
- 眾多功能中總有一個會被先執(zhí)行,不可能多個功能一起執(zhí)行
- 想使用手機必須先執(zhí)行手機的開機功能
- 所以C語言程序也一樣,由眾多功能、眾多程序段組成, 眾多C語言程序段中總有一個會被先執(zhí)行, 這個先執(zhí)行的程序段我們稱之為"主函數(shù)"
- 一個C語言程序由多個"函數(shù)"構成,每個函數(shù)有自己的功能
- 一個程序有且只有一個主函數(shù)
- 如果一個程序沒有主函數(shù),則這個程序不具備運行能力
- 程序運行時系統(tǒng)會自動調用主函數(shù),而其它函數(shù)需要開發(fā)者手動調用
- 主函數(shù)有固定書寫的格式和范寫
函數(shù)定義格式
- 主函數(shù)定義的格式:
- int 代表函數(shù)執(zhí)行之后會返回一個整數(shù)類型的值
- main 代表這個函數(shù)的名字叫做main
- () 代表這是一個函數(shù)
- {} 代表這個程序段的范圍
- return 0; 代表函數(shù)執(zhí)行完之后返回整數(shù)0
int?main()?{
????//?insert?code?here...
????return?0;
}
- 其它函數(shù)定義的格式
- int 代表函數(shù)執(zhí)行之后會返回一個整數(shù)類型的值
- call 代表這個函數(shù)的名字叫做call
- () 代表這是一個函數(shù)
- {} 代表這個程序段的范圍
- return 0; 代表函數(shù)執(zhí)行完之后返回整數(shù)0
int?call()?{
????return?0;
}
如何執(zhí)行定義好的函數(shù)
- 主函數(shù)(main)會由系統(tǒng)自動調用, 但其它函數(shù)不會, 所以想要執(zhí)行其它函數(shù)就必須在main函數(shù)中手動調用
- call 代表找到名稱叫做call的某個東西
- () 代表要找到的名稱叫call的某個東西是一個函數(shù)
- ; ?代表調用函數(shù)的語句已經(jīng)編寫完成
- 所以call();代表找到call函數(shù), 并執(zhí)行call函數(shù)
int?main()?{
????call();
????return?0;
}
- 如何往屏幕上輸出內容
- 并沒有告訴printf函數(shù),我們要往屏幕上輸出什么內容
- 找不到printf函數(shù)的實現(xiàn)代碼
- 輸出內容是一個比較復雜的操作, 所以系統(tǒng)提前定義好了一個專門用于輸出內容的函數(shù)叫做printf函數(shù),我們只需要執(zhí)行系統(tǒng)定義好的printf函數(shù)就可以往屏幕上輸出內容
- 但凡需要執(zhí)行一個函數(shù), 都是通過函數(shù)名稱 圓括號的形式來執(zhí)行
- 如下代碼的含義是: 當程序運行時系統(tǒng)會自動執(zhí)行main函數(shù), 在系統(tǒng)自動執(zhí)行main函數(shù)時我們手動執(zhí)行了call函數(shù)和printf函數(shù)
- 經(jīng)過對代碼的觀察, 我們發(fā)現(xiàn)兩個問題
int?call(){
????return?0;
}
int?main(){
????call();
????printf();
????return?0;
}
- 如何告訴printf函數(shù)要輸出的內容
- 將要輸出的內容編寫到printf函數(shù)后面的圓括號中即可
- 注意: 圓括號中編寫的內容必須用雙引號引起來
printf("hello?world\n");
- 如何找到printf函數(shù)的實現(xiàn)代碼
- 由于printf函數(shù)是系統(tǒng)實現(xiàn)的函數(shù), 所以想要使用printf函數(shù)必須在使用之前告訴系統(tǒng)去哪里可以找到printf函數(shù)的實現(xiàn)代碼
- #include
就是告訴系統(tǒng)可以去stdio這個文件中查找printf函數(shù)的聲明和實現(xiàn)
#include?
int?call(){
????return?0;
}
int?main(){
????call();
????printf("hello?world\n");
????return?0;
}
如何運行編寫好的程序
- 方式1:
- 點擊小榔頭將"源代碼"編譯成"可執(zhí)行文件"
- 找到編譯后的源代碼, 打開終端(CMD)運行可執(zhí)行文件
- 方式2
- 直接點擊Qt開發(fā)工具運行按鈕
main函數(shù)注意點及其它寫法
- C語言中,每條完整的語句后面都必須以分號結尾
int?main(){
????printf("hello?world\n")?//?如果沒有分號編譯時會報錯
????return?0;
}
int?main(){
????//?如果沒有分號,多條語句合并到一行時,?系統(tǒng)不知道從什么地方到什么地方是一條完整語句
????printf("hello?world\n")?return?0;
}
- C語言中除了注釋和雙引號引起來的地方以外都不能出現(xiàn)中文
int?main(){
????printf("hello?world\n");?//?這里的分號如果是中文的分號就會報錯
????return?0;
}
- 一個C語言程序只能有一個main函數(shù)
int?main(){
????return?0;
}
int?main(){?//?編譯時會報錯,?重復定義
????return?0;
}
- 一個C語言程序不能沒有main函數(shù)
int?call(){?//?編譯時報錯,?因為只有call函數(shù),?沒有main函數(shù)
????return?0;
}
int?mian(){?//?編譯時報錯,?因為main函數(shù)的名稱寫錯了,還是相當于沒有main函數(shù)
????return?0;
}
- main函數(shù)前面的int可以不寫或者換成void
#include?
main(){?//?不會報錯
????printf("hello?world\n");
????return?0;
}
#include?
void?main(){??//?不會報錯
????printf("hello?world\n");
????return?0;
}
- main函數(shù)中的return 0可以不寫
int?main(){?//?不會報錯
????printf("hello?world\n");
}
- 多種寫法不報錯的原因
- Turbo C
- Visual C(VC)
- GNU C(GCC)
- C語言最早的時候只是一種規(guī)范和標準(例如C89, C11等)
- 標準的推行需要各大廠商的支持和實施
- 而在支持的實施的時候由于各大廠商利益、理解等問題,導致了實施的標準不同,發(fā)生了變化
- 所以大家才會看到不同的書上書寫的格式有所不同, 有的返回int,有的返回void,有的甚至沒有返回值
- 所以大家只需要記住最標準的寫法即可, no zuo no die
#include?
int?main(){
????printf("hello?world\n");
????return?0;
}
Tips: 語法錯誤:編譯器會直接報錯 邏輯錯誤:沒有語法錯誤,只不過運行結果不正確
C語言程序練習
- 編寫一個C語言程序,用至少2種方式在屏幕上輸出以下內容
???***?***
??*********
???*******
????****
?????**
- 普通青年實現(xiàn)
printf("?***?***?\n");
printf("*********\n");
printf("?*******\n");
printf("??****\n");
printf("???**\n");
- 2B青年實現(xiàn)
printf("?***?***?\n*********\n?*******\n??****\n???**\n");
- 文藝青年實現(xiàn)(裝逼的, 先不用理解)
int??i?=?0;
while?(1)?{
????if?(i?%?2?==?0)?{
????????printf("?***?***?\n");
????????printf("*********\n");
????????printf("?*******\n");
????????printf("??****\n");
????????printf("???**\n");
????}else
????{
????????printf("\n");
????????printf("???**?**?\n");
????????printf("??*******\n");
????????printf("???*****\n");
????????printf("????**\n");
????}
????sleep(1);
????i ;
????system("cls");
}
初學者如何避免程序出現(xiàn)BUG
??????????????????????????_ooOoo_
?????????????????????????o8888888o
?????????????????????????88"?.?"88
?????????????????????????(|?-_-?|)
??????????????????????????O\?=?/O
??????????????????????____/`---'\____
????????????????????.???'?\\|?|//?`.
?????????????????????/?\\|||?:?|||//?\
???????????????????/?_|||||?-:-?|||||-?\
?????????????????????|?|?\\\?-?///?|?|
???????????????????|?\_|?''\---/''?|?|
????????????????????\?.-\__?`-`?___/-.?/
?????????????????___`.?.'?/--.--\?`.?.?__
??????????????.""?'`.___\_<|>_/___.'?>'"".
?????????????|?|?:?`-?\`.;`\?_?/`;.`/?-?`?:?|?|
???????????????\?\?`-.?\_?__\?/__?_/?.-`?/?/
???????======`-.____`-.___\_____/___.-`____.-'======
??????????????????????????`=---='
???????.............................................
??????????????佛祖保佑???????????????????有無BUG
━━━━━━神獸出沒━━━━━━
?????????┏┓????┏┓
????????┏┛┻━━━━━━┛┻┓
????????┃????????┃
????????┃???━????┃
????????┃?┳┛???┗┳?┃
????????┃????????┃
????????┃???┻????┃
????????┃??????????┃
????????┗━┓????┏━┛Code?is?far?away?from?bug?with?the?animal?protecting
??????????┃????┃????神獸保佑,代碼無bug
??????????┃????┃
??????????┃????┗━━━┓
??????????┃????????┣┓
??????????┃?????┏━━┛┛
??????????┗┓┓┏━┳┓┏┛
???????????┃┫┫?┃┫┫
???????????┗┻┛?┗┻┛
??????━━━━━━感覺萌萌噠━━━━━━
????????′′′′′′′′██′′′′′′′
????????′′′′′′′████′′′′′′
????????′′′′′████████′′′′
????????′′`′███????███′′′′′
????????′′′███?●??●?██′′′
????????′′′███??????██′′′′′
????????′′′███????██′??????????????????????項目:第一個C語言程序
????????′′██████??███′′′′′?????????????????語言:C語言
????????′██████????███′′???????????????????編輯器:Qt Creator
????????██████??????███′′′′????????????????版本控制:git-github
????????′′▓▓▓▓▓▓▓▓▓▓▓▓▓?′′?????????????????代碼風格:江哥style
????????′′????▓▓▓▓▓▓▓▓▓?′′′′′??????????????
????????′.???′′▓▓▓▓▓▓▓▓?′′′′′??????????????
????????′.??′′′′▓▓▓▓▓▓▓????????????????????
????????..??.′′′′▓▓▓▓▓▓▓????????????????????
????????′??????????????????????????????????
????????′′′′′′′′′███████′′′′′??????????????
????????′′′′′′′′████████′′′′′′′
????????′′′′′′′█████████′′′′′′
????????′′′′′′██████████′′′′?????????????大部分人都在關注你飛的高不高,卻沒人在乎你飛的累不累,這就是現(xiàn)實!
????????′′′′′′██████████′′′?????????????????????我從不相信夢想,我,只,相,信,自,己!
????????′′′′′′′█████████′′
????????′′′′′′′█████████′′′
????????′′′′′′′′████████′′′′′
????????________?????
????????_________????
????????_________????
????????________??_??
????????_______??__??
????????_____???___??
????????_____??___??
????????____??____??
????????___??_____??
????????███____???
????????████____███
????????█?_███_?_█_███
——————————————————————————女神保佑,代碼無bug——————————————————————
多語言對比
- C語言
#include
int?main()?{
????printf("南哥帶你裝B帶你飛");
????return?0;
}
- C 語言
#include
using?namespace?std;
int?main()?{
????cout?<"南哥帶你裝B帶你飛"?<????return?0;
}
- OC語言
#import?
int?main()?{
????NSLog(@"南哥帶你裝B帶你飛");
????return?0;
}
- Java語言
class?Test
{
????public?static?viod?main()
????{
????????system.out.println("南哥帶你裝B帶你飛");
????}
}
- Go語言
package?main
import??"fmt"?//引入fmt庫
func?main()?{
????fmt.Println("南哥帶你裝B帶你飛")
}
什么是注釋?
- 注釋是在所有計算機語言中都非常重要的一個概念,從字面上看,就是注解、解釋的意思
- 注釋可以用來解釋某一段程序或者某一行代碼是什么意思,方便程序員之間的交流溝通
- 注釋可以是任何文字,也就是說可以寫中文
- 被注釋的內容在開發(fā)工具中會有特殊的顏色
為什么要使用注釋?
- 沒有編寫任何注釋的程序
void?printMap(char?map[6][7]?,?int?row,?int?col);
int?main(int?argc,?const?char?*?argv[])
{
????char?map[6][7]?=?{
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'},
????????{'#',?'?',?'?',?'?',?'#'?,'?',?'?'},
????????{'#',?'R',?'?',?'#',?'#',?'?',?'#'},
????????{'#',?'?',?'?',?'?',?'#',?'?',?'#'},
????????{'#',?'#',?'?',?'?',?'?',?'?',?'#'},
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'}
????};
????int?row?=?sizeof(map)/sizeof(map[0]);
????int?col?=?sizeof(map[0])/?sizeof(map[0][0]);
????printMap(map,?row,?col);
????int?pRow?=?2;
????int?pCol?=?1;
????int?endRow?=?1;
????int?endCol?=?6;
????while?('R'?!=?map[endRow][endCol])?{
????????printf("親,?請輸入相應的操作\n");
????????printf("w(向上走)?s(向下走)?a(向左走)?d(向右走)\n");
????????char?run;
????????run?=?getchar();
????????switch?(run)?{
????????????case?'s':
????????????????if?('#'?!=?map[pRow? ?1][pCol])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pRow ;//3
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'w':
????????????????if?('#'?!=?map[pRow?-?1][pCol])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pRow--;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'a':
????????????????if?('#'?!=?map[pRow][pCol?-?1])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pCol--;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'d':
????????????????if?('#'?!=?map[pRow][pCol? ?1])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pCol ;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????}
????????printMap(map,?row,?col);
????}
????printf("你太牛X了\n");
????printf("想挑戰(zhàn)自己,請購買完整版本\n");
????return?0;
}
void?printMap(char?map[6][7]?,?int?row,?int?col)
{
????system("cls");
????for?(int?i?=?0;?i?????????for?(int?j?=?0;?j?????????????printf("%c",?map[i][j]);
????????}
????????printf("\n");
????}
}
- 編寫了注釋的程序
/*
?????R代表一個人
?????#代表一堵墻
//???0123456
?????#######?//?0
?????#???#???//?1
?????#R?##?#?//?2
?????#???#?#?//?3
?????##????#?//?4
?????#######?//?5
?????分析:
?????>1.保存地圖(二維數(shù)組)
?????>2.輸出地圖
?????>3.操作R前進(控制小人行走)
??????3.1.接收用戶輸入(scanf/getchar)
??????w(向上走)?s(向下走)?a(向左走)?d(向右走)
??????3.2.判斷用戶的輸入,控制小人行走
?????????3.2.1.替換二維數(shù)組中保存的數(shù)據(jù)
?????????????(
????????????????1.判斷是否可以修改(如果不是#就可以修改)
????????????????2.修改現(xiàn)有位置為空白
????????????????3.修改下一步為R
?????????????)
??????3.3.輸出修改后的二維數(shù)組
?????4.判斷用戶是否走出出口
*/
//?聲明打印地圖方法
void?printMap(char?map[6][7]?,?int?row,?int?col);
int?main(int?argc,?const?char?*?argv[])
{
????//?1.定義二維數(shù)組保存迷宮地圖
????char?map[6][7]?=?{
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'},
????????{'#',?'?',?'?',?'?',?'#'?,'?',?'?'},
????????{'#',?'R',?'?',?'#',?'#',?'?',?'#'},
????????{'#',?'?',?'?',?'?',?'#',?'?',?'#'},
????????{'#',?'#',?'?',?'?',?'?',?'?',?'#'},
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'}
????};
????//?2.計算地圖行數(shù)和列數(shù)
????int?row?=?sizeof(map)/sizeof(map[0]);
????int?col?=?sizeof(map[0])/?sizeof(map[0][0]);
????//?3.輸出地圖
????printMap(map,?row,?col);
????//?4.定義變量記錄人物位置
????int?pRow?=?2;
????int?pCol?=?1;
????//?5.定義變量記錄出口的位置
????int?endRow?=?1;
????int?endCol?=?6;
????//?6.控制人物行走
????while?('R'?!=?map[endRow][endCol])?{
????????//?6.1提示用戶如何控制人物行走
????????printf("親,?請輸入相應的操作\n");
????????printf("w(向上走)?s(向下走)?a(向左走)?d(向右走)\n");
????????char?run;
????????run?=?getchar();
????????//?6.2根據(jù)用戶輸入控制人物行走
????????switch?(run)?{
????????????case?'s':
????????????????if?('#'?!=?map[pRow? ?1][pCol])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pRow ;//3
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'w':
????????????????if?('#'?!=?map[pRow?-?1][pCol])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pRow--;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'a':
????????????????if?('#'?!=?map[pRow][pCol?-?1])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pCol--;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????????case?'d':
????????????????if?('#'?!=?map[pRow][pCol? ?1])?{
????????????????????map[pRow][pCol]?=?'?';
????????????????????pCol ;
????????????????????map[pRow][pCol]?=?'R';
????????????????}
????????????????break;
????????}
????????//?6.3重新輸出行走之后的地圖
????????printMap(map,?row,?col);
????}
????printf("你太牛X了\n");
????printf("想挑戰(zhàn)自己,請購買完整版本\n");
????return?0;
}
/**
?*?@brief?printMap
?*?@param?map?需要打印的二維數(shù)組
?*?@param?row?二維數(shù)組的行數(shù)
?*?@param?col?二維數(shù)組的列數(shù)
?*/
void?printMap(char?map[6][7]?,?int?row,?int?col)
{
????//?為了保證窗口的干凈整潔,?每次打印都先清空上一次的打印
????system("cls");
????for?(int?i?=?0;?i?????????for?(int?j?=?0;?j?????????????printf("%c",?map[i][j]);
????????}
????????printf("\n");
????}
}
注釋的分類
- 單行注釋
- // 被注釋內容
- 使用范圍:任何地方都可以寫注釋:函數(shù)外面、里面,每一條語句后面
- 作用范圍: 從第二個斜線到這一行末尾
- 快捷鍵:Ctrl /
- 多行注釋
- /* 被注釋內容 */
- 使用范圍:任何地方都可以寫注釋:函數(shù)外面、里面,每一條語句后面
- 作用范圍: 從第一個/*到最近的一個*/
注釋的注意點
- 單行注釋可以嵌套單行注釋、多行注釋
//?南哥?//?公號代碼情緣
//?/*?江哥?*/
//?瓜哥
- 多行注釋可以嵌套單行注釋
/*
//?作者:LNJ
//?描述:第一個C語言程序作用:這是一個主函數(shù),C程序的入口點
?*/
- 多行注釋***不能***嵌套多行注釋
/*?
哈哈哈
?????/*嘻嘻嘻*/
?呵呵呵?
*/
注釋的應用場景
- 思路分析
/*
?????R代表一個人
?????#代表一堵墻
//???0123456
?????#######?//?0
?????#???#???//?1
?????#R?##?#?//?2
?????#???#?#?//?3
?????##????#?//?4
?????#######?//?5
?????分析:
?????>1.保存地圖(二維數(shù)組)
?????>2.輸出地圖
?????>3.操作R前進(控制小人行走)
??????3.1.接收用戶輸入(scanf/getchar)
??????w(向上走)?s(向下走)?a(向左走)?d(向右走)
??????3.2.判斷用戶的輸入,控制小人行走
?????????3.2.1.替換二維數(shù)組中保存的數(shù)據(jù)
?????????????(
????????????????1.判斷是否可以修改(如果不是#就可以修改)
????????????????2.修改現(xiàn)有位置為空白
????????????????3.修改下一步為R
?????????????)
??????3.3.輸出修改后的二維數(shù)組
?????4.判斷用戶是否走出出口
*/
- 對變量進行說明
//?2.計算地圖行數(shù)和列數(shù)
int?row?=?sizeof(map)/sizeof(map[0]);
int?col?=?sizeof(map[0])/?sizeof(map[0][0]);
- 對函數(shù)進行說明
/**
?*?@brief?printMap
?*?@param?map?需要打印的二維數(shù)組
?*?@param?row?二維數(shù)組的行數(shù)
?*?@param?col?二維數(shù)組的列數(shù)
?*/
void?printMap(char?map[6][7]?,?int?row,?int?col)
{
????system("cls");
????for?(int?i?=?0;?i?????????for?(int?j?=?0;?j?????????????printf("%c",?map[i][j]);
????????}
????????printf("\n");
????}
}
- 多實現(xiàn)邏輯排序
????//?1.定義二維數(shù)組保存迷宮地圖
????char?map[6][7]?=?{
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'},
????????{'#',?'?',?'?',?'?',?'#'?,'?',?'?'},
????????{'#',?'R',?'?',?'#',?'#',?'?',?'#'},
????????{'#',?'?',?'?',?'?',?'#',?'?',?'#'},
????????{'#',?'#',?'?',?'?',?'?',?'?',?'#'},
????????{'#',?'#',?'#',?'#',?'#',?'#',?'#'}
????};
????//?2.計算地圖行數(shù)和列數(shù)
????int?row?=?sizeof(map)/sizeof(map[0]);
????int?col?=?sizeof(map[0])/?sizeof(map[0][0]);
????//?3.輸出地圖
????printMap(map,?row,?col);
????//?4.定義變量記錄人物位置
????int?pRow?=?2;
????int?pCol?=?1;
????//?5.定義變量記錄出口的位置
????int?endRow?=?1;
????int?endCol?=?6;
????//?6.控制人物行走
????while?('R'?!=?map[endRow][endCol])?{
????????...?...
????}
使用注釋的好處
- 注釋是一個程序員必須要具備的良好習慣
- 幫助開發(fā)人員整理實現(xiàn)思路
- 解釋說明程序, 提高程序的可讀性
- 初學者編寫程序可以養(yǎng)成習慣:先寫注釋再寫代碼
- 將自己的思想通過注釋先整理出來,在用代碼去體現(xiàn)
- 因為代碼僅僅是思想的一種體現(xiàn)形式而已
什么是關鍵字?
- 關鍵字,也叫作保留字。是指一些被C語言賦予了特殊含義的單詞
- 關鍵字特征:
- 全部都是小寫
- 在開發(fā)工具中會顯示特殊顏色
- 關鍵字注意點:
- 因為關鍵字在C語言中有特殊的含義, 所以不能用作變量名、函數(shù)名等
- C語言中一共有32個關鍵字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
char | short | int | long | float | double | if | else |
return | do | while | for | switch | case | break | continue |
default | goto | sizeof | auto | register | static | extern | unsigned |
signed | typedef | struct | enum | union | void | const | volatile |
這些不用專門去記住,用多了就會了。在編譯器里都是有特殊顏色的。我們用到時候會一個一個講解這個些關鍵字怎么用,現(xiàn)在瀏覽下,有個印象就OK了
關鍵字分類
什么是標識符?
- 從字面上理解,就是用來標識某些東西的符號,標識的目的就是為了將這些東西區(qū)分開來
- 其實標識符的作用就跟人類的名字差不多,為了區(qū)分每個人,就在每個人出生的時候起了個名字
- C語言是由函數(shù)構成的,一個C程序中可能會有多個函數(shù),為了區(qū)分這些函數(shù),就給每一個函數(shù)都起了個名稱, 這個名稱就是標識符
- 綜上所述: 程序員在程序中給函數(shù)、變量等起名字就是標識符
標識符命名規(guī)則
- 只能由字母(a~z、 A~Z)、數(shù)字、下劃線組成
- 不能包含除下劃線以外的其它特殊字符串
- 不能以數(shù)字開頭
- 不能是C語言中的關鍵字
- 標識符嚴格區(qū)分大小寫, test和Test是兩個不同的標識符
練習
- 下列哪些是合法的標識符
fromNo22 | from#22 | my_Boolean | my-Boolean | 2ndObj | GUI | lnj |
Mike2jack | 江哥 | _test | test!32 | haha(da)tt | jack_rose | jack
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀
要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢... 關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟 |