C語言基本概念(上)【C語言入門到精通】

C語言基本概念

Syntactic sugar causes cancer of the semi-colons.[1]

碼字不易,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注 支持一下作者
微信搜公眾號:不會編程的程序圓
看更多干貨,獲取第一時間更新

推薦在我的公眾號上閱讀原文蓖议,排版比較好
點擊查看原文

:earth_asia:思維導圖


在這里插入圖片描述

:globe_with_meridians:目錄


@[toc]

:email:寫在前面


如果只是寫個人學習總結(jié)的博客很容易,簡單寫一些感悟然后貼上代碼走人就可以了讥蟆,甚至不用校審勒虾。但是我命名本系列為【C語言必知必會】幫助你從入門到精通 C語言,那勢必要“事無巨細”一些:既要考慮到?jīng)]有基礎的初學者瘸彤,又不能止于基礎修然。所以本教程適合各類人群學習,只要你看就一定會有幫助质况。

本教程是本人純手打并排版愕宋,校審由我與我的搭檔湯圓君一起完成的。你們看這一篇文章我要寫好幾個小時结榄。如果文章對你有幫助中贝,請不要“白嫖”。支持一下作者臼朗,作者會發(fā)更多干貨好文邻寿。

特別鳴謝:湯圓君(公眾號:【Cc聽香水榭】 長期更新高質(zhì)量英語教學)關注她表示對她工作的認可吧蝎土!

:books:教學


第一個C程序

main.c

#include<stdio.h>

int main(void){
    
    printf("Hello,World\n");//a simple C program
    
    return 0;
}

將上述程序?qū)懺谀愕木幾g器里绣否。

然后給文件命名誊涯,并以.c作為擴展名,例如main.c蒜撮。

現(xiàn)在暴构,編譯并運行該程序。如果一切正常淀弹,輸出的應該是:

Hello,World

恭喜你丹壕,你已經(jīng)是一名C程序員了!:laughing:

Hello薇溃,World 是偉大的菌赖。它像著一個呱呱墜地的嬰兒對世界的問好,它憧憬著美好的世界沐序,一切事物都是新鮮的琉用。

? ——不會編程的程序圓

現(xiàn)在,讓我們看看這個程序到底是什么意思策幼。

正式開始之前

編譯和鏈接

C程序編譯鏈接的過程:(知道即可)

在這里插入圖片描述

集成開發(fā)環(huán)境

集成開發(fā)環(huán)境(integrated development enviroment,IDE):集成開發(fā)環(huán)境是一個軟件包邑时,我們可以在其中編輯,編譯特姐,鏈接晶丘,執(zhí)行和調(diào)試程序。

IDE推薦:

CodeBlock(本教學中的簡單的程序會用這個軟件來完成)

VS2019(編寫需要調(diào)試的程序用它來完成)

簡單程序的一般形式

1. 指令

示例程序第一行#include<stdio.h>就是一條指令唐含。

在程序編譯之前浅浮,C編譯器的預處理器(preprocessor)會首先對源代碼進行一些準備工作,即預處理(preprocessing)捷枯。

指令(directive):我們把 預處理器 執(zhí)行的命令稱為 預處理器指令(preprocessor directive)滚秩,簡稱指令。

指令的結(jié)尾不需要添加分號

#include<stdio.h>的作用相當于把 頭文件 stdio.h 中的所有內(nèi)容都輸入到該行所在的位置淮捆。

實際上郁油,這是一種復制+粘貼的操作。

include 文件提供了一種方便的途徑共享許多程序共有的信息攀痊。

stdio.h文件中包含了供編譯器使用的輸入和輸出函數(shù)(如 printf())信息桐腌。

該文件名的含義為標準輸入/輸出頭文件(stadard input&output .header)

頭文件(header):在C程序頂部的信息集合。

每個頭文件都包含一些標準庫的內(nèi)容苟径。

示例程序引入stdio.h頭文件的原因:C語言不同于其他編程語言案站,它沒有內(nèi)置的“讀/寫”命令。輸入/輸出功能由標準庫中的函數(shù)實現(xiàn)涩笤。[2]

每次用到庫函數(shù)嚼吞,必須用#include指令包含相關的頭文件盒件。省略必要的頭文件可能不會對某一個特定程序造成影響,但是最好不要這樣做舱禽。

2.函數(shù)

int main(void)

函數(shù):類似于其他編程語言的“過程”或“子例程”炒刁,它們是用來構建程序的構建塊。

事實上誊稚,C語言就是函數(shù)的集合翔始。

函數(shù)分兩大類:第一種是程序員自己編寫的函數(shù);另一類則是C作為語言實現(xiàn)的一部分提供的函數(shù)里伯,即庫函數(shù)(library function)城瞎。因為它們屬于一個由編譯器提供的函數(shù)“庫”。

main函數(shù):C程序都是從main()函數(shù)“開始”執(zhí)行疾瓮。main()函數(shù)是程序的唯一入口脖镀。可以理解為程序是從main函數(shù)開始運行到main函數(shù)結(jié)尾結(jié)束。

返回類型int是main函數(shù)的 返回類型狼电。這表明 main函數(shù)返回的值是整型蜒灰。

返回給哪里?返回給操作系統(tǒng)肩碟,我們后面再來講解

參數(shù)()內(nèi)包含的信息為函數(shù)的參數(shù)强窖。示例中的void表示該例中沒有傳入任何參數(shù)。

請注意

有背景顏色的地方都是重要的知識削祈,但是在這里不管你是初學者/學了一段時間了翅溺,我都建議你遵守以下規(guī)范:

main函數(shù)到底應該怎么寫?我在這里不詳細展開說髓抑。

正確的形式int main(int argc, char* argv[])

可以接受的形式:int main(void)

錯誤的寫法int main() 譚老師書中的寫法咙崎。跟我學,不要用這種寫法

腦癱的寫法void main() void main(void)所有C語言的標準都未認可這種寫法启昧,你在贛神魔叙凡?

return 0

返回值:前面我們講到了返回類型劈伴,那么就應該有個返回值密末。示例中 return就代表返回,0是這個main函數(shù)的返回值跛璧。

main函數(shù)中return的作用

1.使main函數(shù)終止严里。mian函數(shù)在這里結(jié)束。

2.main函數(shù)返回值是0追城,表示程序正常終止刹碾。

所以,return 0在main函數(shù)中是不可省略的

雖然即使你不寫座柱,可能也可以通過編譯迷帜,但是不寫是不對的物舒。

3.語句

語句是程序運行時執(zhí)行的命令

語句是帶順序執(zhí)行的 C 程序段。任何函數(shù)體都是一條復合語句戏锹,繼而為語句或聲明的序列

例如:

int main(void)
{ // 復合語句的開始
    int n = 1; // 聲明(非語句)
    n = n+1; // 表達式語句
    printf("n = %d\n", n); // 表達式語句
    return 0; // 返回語句
} // 復合語句之結(jié)尾冠胯,函數(shù)體之結(jié)尾

C語言中的六種語句

  1. 標號語句

    1. goto 語句的目標。 (標識符 : 語句

    2. switch 語句的 case 標號锦针。(case 常量表達式 : 語句

    3. switch 語句的默認標號荠察。 (default : 語句

  2. 復合語句

    復合語句,或稱奈搜,是花括號所包圍的語句與聲明的序列悉盆。

    {聲明(可選)| 語句 }

  3. 表達式語句

    典型的 C 程序中大多數(shù)語句是表達式語句,例如賦值或函數(shù)調(diào)用馋吗。

    無表達式的表達式語句被稱作空語句焕盟。它通常用于提供空循環(huán)體給 forwhile 循環(huán)。

  4. 選擇語句

    選擇語句根據(jù)表達式的值宏粤,選擇數(shù)條語句之一執(zhí)行京髓。

    1. if 語句

    2. if 語句帶 else 子句

    3. switch 語句

  5. 迭代語句

    迭代語句重復執(zhí)行一條語句。

    1. while 循環(huán)

    2. do-while 循環(huán)

    3. for 循環(huán)

  6. 跳轉(zhuǎn)語句

    跳轉(zhuǎn)語句無條件地轉(zhuǎn)移控制流商架。

    1. break 語句

    2. continue 語句

    3. return 語句帶可選的表達式

    4. goto 語句

為什么需要分號堰怨?

由于語句可以連續(xù)占用多行,有時很難確定它結(jié)束的位置蛇摸,因此需要用分號來向編譯器表示語句結(jié)束的位置备图。但預處理指令通常只用占一行,因此不需要分號結(jié)尾

4.打印字符串 printf() 函數(shù)

printf("Hello赶袄,World\n");

printf()是一個功能十分強大的函數(shù)揽涮。后面我們會進一步介紹

示例中我們只是用printf函數(shù)打印了出了一條字符串字面量(string literal) —— 用一對雙引號引起來的一系列字符。

字符串饿肺,顧名思義就是一串字符蒋困。

printf函數(shù)不會自動換行到下一行打印,它只會在它最開始那一行一直打印直到程序迫使它換行敬辣。

\n表示printf函數(shù)打印完成后跳轉(zhuǎn)到下一行

請看如下程序雪标,思考它的效果與示例中有何不同?

printf("Hello,");
printf("World\n");

答案[3](點擊或到文章尾查看)

如果想輸出下面的結(jié)果,請考慮一下,應該如何寫程序呢鲫构?

Hello,
World

答案:

printf("Hello,\n");
printf("World\n");

對于這個問題牍颈,第二個printf函數(shù)的 \n 可以省略。簡單來說,printf函數(shù)會在 \n 出現(xiàn)的地方換行。

5.注釋

//a simple C program

寫注釋可以讓自己和別人更容易明白你寫的程序玩焰。

C語言注釋的好處是:可以寫在任何地方逆粹。注釋的部分會被編譯器忽略募疮。

我們試想一件事你昨天吃了什么飯,記性好是吧僻弹?上周五吃的什么飯酝锅?如果連上周 一天三頓的飯都不能記住,何況你自己查看你很久之前寫的代碼呢奢方?

兩種注釋符號

第一種:/* */

單行注釋

/* 關注微信公眾號:不會編程的程序圓 */
/* 看更多干貨搔扁,獲取第一時間更新 */
/* 碼字不易,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注蟋字,鼓勵一下作者 */

多行注釋

/* 關注微信公眾號:不會編程的程序圓
看更多干貨稿蹲,獲取第一時間更新
碼字不易,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注鹊奖,鼓勵一下作者 */

但是苛聘,上面這一種注釋方式可能難以閱讀,因為人不不容易發(fā)現(xiàn)注釋結(jié)束的位置忠聚。

改進:

/*關注微信公眾號:不會編程的程序圓
看更多干貨设哗,獲取第一時間更新
碼字不易,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注两蟀,鼓勵一下作者
*/

更好的方法:將注釋部分圍起來

/*************************************************
 *   關注微信公眾號:不會編程的程序圓                  *
 *   看更多干貨网梢,獲取第一時間更新                     *
 *   碼字不易,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注赂毯,鼓勵一下作者   *
*************************************************/

當然如果你嫌麻煩战虏,也可以簡化一下:

/*
 * 關注微信公眾號:不會編程的程序圓
 * 看更多干貨,獲取第一時間更新
 * 碼字不易党涕,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注烦感,鼓勵一下作者
 */

簡短的注釋可以放在同一行

printf("Hello World\n");/* 不會編程的程序圓 */

但是,如果你忘記了終止注釋可能會導致你的編譯器跳過程序的一部分膛堤,請思考下列:

printf("不會"); /* 關注我的公眾號呦~
printf("編程"); 
printf("的");   /* 更多鼓勵手趣,更多干貨!*/
printf("程序圓");

你可以在自己的編譯器上自己敲一下肥荔,看看會輸出什么绿渣。

由于第一條注釋忘記輸入結(jié)束標志,導致編譯器將直到找到結(jié)束標志之前的程序都當成了注釋次企!

第二種://

C99提供的新的注釋方式怯晕。

//關注微信公眾號:不會編程的程序圓
//看更多干貨潜圃,獲取第一時間更新
//碼字不易缸棵,對你有幫助 點贊/轉(zhuǎn)發(fā)/關注,鼓勵一下作者

新的注釋風格有兩大優(yōu)點:

  1. 這種注釋會在行末自動終結(jié)谭期,所以不用擔心會出現(xiàn)未終止的注釋意外吞噬部分程序的情況
  2. 每行前都有 // 堵第,所以多行的注釋更加醒目

綜上所述吧凉,建議采用 // 這種注釋方式

參考資料:《C Primer Plus》《C語言程序設計:現(xiàn)代方法》 網(wǎng)上資料:cppreference.com


本文GitHub已更新,文中代碼都可以在上面對應的目錄下找到踏志,歡迎 star 阀捅!
https://github.com/hairrrrr/C-CrashCourse

以上就是本次的內(nèi)容。

如果文章有錯誤歡迎指正和補充针余,感謝饲鄙!

最后,如果你還有什么問題或者想知道到的圆雁,可以在評論區(qū)告訴我呦忍级,我在后面的文章可以加上。

關注我伪朽,看更多干貨轴咱!

我是程序圓,我們下次再見烈涮。


  1. 語法糖導致分號癌朴肺。摘自《epigrams-on-programming》 ?

  2. 為何不內(nèi)置輸入/輸出? 原因之一是并非所有程序都會用到I/O(輸入輸出)包 。簡潔高效表現(xiàn)了C語言的哲學坚洽。 ?

  3. 相同戈稿。 ?

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讶舰,隨后出現(xiàn)的幾起案子器瘪,更是在濱河造成了極大的恐慌,老刑警劉巖绘雁,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡疼,死亡現(xiàn)場離奇詭異,居然都是意外死亡庐舟,警方通過查閱死者的電腦和手機欣除,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挪略,“玉大人历帚,你說我怎么就攤上這事「苡椋” “怎么了挽牢?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摊求。 經(jīng)常有香客問我禽拔,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任睹栖,我火速辦了婚禮硫惕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘野来。我一直安慰自己恼除,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布曼氛。 她就那樣靜靜地躺著豁辉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舀患。 梳的紋絲不亂的頭發(fā)上秋忙,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音构舟,去河邊找鬼灰追。 笑死,一個胖子當著我的面吹牛狗超,可吹牛的內(nèi)容都是我干的弹澎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼努咐,長吁一口氣:“原來是場噩夢啊……” “哼苦蒿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渗稍,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佩迟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后竿屹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體报强,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年拱燃,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉溉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡碗誉,死狀恐怖召嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哮缺,我是刑警寧澤弄跌,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站尝苇,受9級特大地震影響铛只,放射性物質(zhì)發(fā)生泄漏埠胖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一格仲、第九天 我趴在偏房一處隱蔽的房頂上張望押袍。 院中可真熱鬧诵冒,春花似錦凯肋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豹芯,卻和暖如春悄雅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铁蹈。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工宽闲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人握牧。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓容诬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沿腰。 傳聞我的和親對象是個殘疾皇子览徒,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容