當前位置:首頁 > 公眾號精選 > 嵌入式大雜燴
[導讀]點擊上方「嵌入式大雜燴」,選擇「置頂公眾號」第一時間查看嵌入式筆記!來源:代碼情緣哈嘍,大家好,我是瓜哥,致力于為大家分享互聯(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個關鍵字
12345678
charshortintlongfloatdoubleifelse
returndowhileforswitchcasebreakcontinue
defaultgotosizeofautoregisterstaticexternunsigned
signedtypedefstructenumunionvoidconstvolatile
這些不用專門去記住,用多了就會了。在編譯器里都是有特殊顏色的。我們用到時候會一個一個講解這個些關鍵字怎么用,現(xiàn)在瀏覽下,有個印象就OK了

關鍵字分類

什么是標識符?

  • 從字面上理解,就是用來標識某些東西的符號,標識的目的就是為了將這些東西區(qū)分開來
  • 其實標識符的作用就跟人類的名字差不多,為了區(qū)分每個人,就在每個人出生的時候起了個名字
  • C語言是由函數(shù)構成的,一個C程序中可能會有多個函數(shù),為了區(qū)分這些函數(shù),就給每一個函數(shù)都起了個名稱, 這個名稱就是標識符
  • 綜上所述: 程序員在程序中給函數(shù)、變量等起名字就是標識符

標識符命名規(guī)則

  • 只能由字母(a~z、 A~Z)、數(shù)字、下劃線組成
  • 不能包含除下劃線以外的其它特殊字符串
  • 不能以數(shù)字開頭
  • 不能是C語言中的關鍵字
  • 標識符嚴格區(qū)分大小寫, test和Test是兩個不同的標識符

練習

  • 下列哪些是合法的標識符








fromNo22from#22my_Booleanmy-Boolean2ndObjGUIlnj
Mike2jack江哥_testtest!32haha(da)ttjack_rosejack
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉