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語言中的六種語句
-
標號語句
-
復合語句
復合語句,或稱塊奈搜,是花括號所包圍的語句與聲明的序列悉盆。
{聲明(可選)| 語句 }
-
表達式語句
典型的 C 程序中大多數(shù)語句是表達式語句,例如賦值或函數(shù)調(diào)用馋吗。
-
選擇語句
選擇語句根據(jù)表達式的值宏粤,選擇數(shù)條語句之一執(zhí)行京髓。
-
迭代語句
迭代語句重復執(zhí)行一條語句。
-
跳轉(zhuǎn)語句
跳轉(zhuǎn)語句無條件地轉(zhuǎn)移控制流商架。
為什么需要分號堰怨?
由于語句可以連續(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)點:
- 這種注釋會在行末自動終結(jié)谭期,所以不用擔心會出現(xiàn)未終止的注釋意外吞噬部分程序的情況
- 每行前都有 // 堵第,所以多行的注釋更加醒目
綜上所述吧凉,建議采用 //
這種注釋方式
參考資料:《C Primer Plus》《C語言程序設計:現(xiàn)代方法》 網(wǎng)上資料:cppreference.com
本文GitHub已更新,文中代碼都可以在上面對應的目錄下找到踏志,歡迎 star 阀捅!
https://github.com/hairrrrr/C-CrashCourse
以上就是本次的內(nèi)容。
如果文章有錯誤歡迎指正和補充针余,感謝饲鄙!
最后,如果你還有什么問題或者想知道到的圆雁,可以在評論區(qū)告訴我呦忍级,我在后面的文章可以加上。
關注我伪朽,看更多干貨轴咱!
我是程序圓,我們下次再見烈涮。