目錄
為隆陽等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及隆陽網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、做網(wǎng)站、隆陽網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!前言
一、C語言是什么?
二、開發(fā)環(huán)境
1.編譯器
三、初始C語言
1.第一個(gè)C語言程序
2.數(shù)據(jù)類型
2.1 數(shù)據(jù)類型的長度
3. 變量 && 常量
3.1 如何定義變量
3.2?變量的分類?
3.3?變量的作用域和生命周期
3.4常量
1.字面常量
2.const修飾的常變量
3.#define定義的標(biāo)識符常量
4.枚舉常量
4.字符串 && 轉(zhuǎn)義字符
4.1 字符串
4.2 轉(zhuǎn)義字符
5. 判斷&&選擇語句?
5. 循環(huán)
1. for循環(huán)
2. while循環(huán)
3.do...while語句
6. 函數(shù)
7. 數(shù)組
1. 一維數(shù)組?
8. 操作符
9. 常見關(guān)鍵字
1. break
2. continue?
3.?static
10. 指針
11. 結(jié)構(gòu)體
四、?總結(jié)
作者將把C語言的知識要點(diǎn),學(xué)習(xí)心得以文章形式發(fā)表,由于作者目前還是一個(gè)菜鳥,難以避免錯誤和存在觀點(diǎn)片面的時(shí)候,非常感謝讀者指正!希望能在這里與大家共同進(jìn)步,早日成為大牛!
本系列(初始C語言)只是簡單介紹每個(gè)知識點(diǎn)、C語言的基礎(chǔ)知識,意在使讀者(還有自己)大概了解C語言。
? “日志”以及“寫在最后”是我在同一天寫的,如果想聽“沒用”的廢話,那就翻到最后吧:)
? 這是我第一篇也是我熱度最高的博客,雖然遠(yuǎn)不及大佬的博客,我會一直努力。它傾注了我作為初學(xué)者,雖只有淺薄知識但卻擁有這個(gè)這個(gè)年紀(jì)最熱血的情感。它粗糙不堪,許多同學(xué)耐著性子讀它,也細(xì)心地發(fā)現(xiàn)了不少問題,非常感謝!同時(shí)我希望大家學(xué)習(xí)的時(shí)候也能一起修修補(bǔ)補(bǔ)它,雖然它只是塊破布,但我一定會因?yàn)樗谴罄袀兊膲|腳石而感到開心。
我希望我的語言不要像專業(yè)書那樣讓人眼花繚亂,所以除了必要的專業(yè)詞匯,我盡量以“人話”解釋一些語法。
日志22/9/1:
? 22/9/4:
? 22/10/3:
C語言是是一門經(jīng)久不衰的計(jì)算機(jī)編程語言,萬物始于C,學(xué)好C語言,能讓我們?yōu)榫幊讨反蛳聢?jiān)實(shí)基礎(chǔ)。(我也不知道寫什么,反正非常重要就對了)
我們把計(jì)算機(jī)編程語言稱之為高級語言,那什么是低級語言呢?
? 在中學(xué)物理我們知道:電子元件只能傳達(dá)"開"或"閉"兩種信息,所以電子元件(即晶體管)之間也只能用這兩種方式通信。人們把"開"用1代替,把"閉"用0代替。電子計(jì)算機(jī)在初期時(shí),只能識別0和1兩種信號,所以那個(gè)時(shí)候只有科學(xué)家才能進(jìn)行編程工作,這在那時(shí)候是十分困難的。
上面提到的0/1信號,正好為二進(jìn)制提供了用武之地,所以我們把最基本的、計(jì)算機(jī)能夠直接讀取的語言稱之為低級語言。
? 在這里,低級語言就是一串由0和1組成的東西,它轉(zhuǎn)換成匯編語言,進(jìn)而轉(zhuǎn)換成高級語言,才被我們大多數(shù)人學(xué)習(xí)。
? 編譯器的作用就是把上面的過程反過來,將我們?nèi)四芸吹枚?、接近自然語言的、而且能寫出來的高級語言轉(zhuǎn)換成機(jī)器能夠讀懂的低級語言。
? 筆者最初使用的編譯器是Dev C++,然后是Visual? Studio 2019。我比較喜歡VS2019,因?yàn)樗谖覍懘a的同時(shí)能用中文提醒我的錯誤,但有時(shí)候才vs不能通過的代碼反而在Dev C++里能通過,所以目前我以vs為主。
如果有同學(xué)剛接觸C,我建議先使用Dev C++吧,熟悉一下編程環(huán)境,如果已經(jīng)有一定基礎(chǔ)了,直接上vs2019吧。
三、初始C語言 1.第一個(gè)C語言程序下面以Dev C++為例
(1)先新建源文件:文件->新建->源代碼
(2)寫預(yù)處理命令,寫主函數(shù),建立基本框架
尖括號(<>)中的stdio.h叫標(biāo)準(zhǔn)輸入輸出函數(shù),即standard input output.header
#include是一種預(yù)處理命令,它的作用是找到尖括號(或者英文雙引號)中的文件,并將它包含到當(dāng)前文件,被包含的文件中的文本將替換源代碼文件(就是我們正在編寫的東西)中的#include指令。
?看到上面那段話是不是很懵呢,說白了:<>里面的東西有我們等下寫代碼要用的東西,它所包含的代碼會幫我們實(shí)現(xiàn)某些功能,它只是個(gè)名字,實(shí)際上它包含了不少代碼。因?yàn)槟悄硞€(gè)功能我們接下來要用很多次,如果每次都把<>里面的東西打出來,就太麻煩了!而#include就用一行代碼代替了這么多代碼,是不是方便了許多?
舉個(gè)栗子?
如果接下來我們要用到從鍵盤輸入或從屏幕輸出,那我們就需要#include
這里說得有點(diǎn)啰嗦,我剛接觸這個(gè)的時(shí)候很懵:為什么每個(gè)函數(shù)都要加上#include
忘了說了,第二種主函數(shù)這種寫法已經(jīng)是遠(yuǎn)古版本了,最好寫第一種。
一個(gè)程序/工程只能有一個(gè)主函數(shù)(? main()),它是程序/工程的入口。注意main不要寫成mian??!
2.數(shù)據(jù)類型char//字符數(shù)據(jù)類型//就是不是數(shù)字的字符
short//短整型//就是數(shù)字?。ń^對值)的整數(shù),很少用
int //整型//就是整數(shù)
long//長整型//就是數(shù)字(絕對值)大的整數(shù)
long long//更長的整型//很少用
float//單精度浮點(diǎn)數(shù)//就是小數(shù)
double//雙精度浮點(diǎn)數(shù)//小數(shù)位數(shù)多的小數(shù)
§ 為什么會出現(xiàn)這么多類型?
——因?yàn)槲覀儸F(xiàn)實(shí)生活中要用到整數(shù),小數(shù)呀
§ 那為什么整數(shù)有int 和 short 還用long、long long,小數(shù)有float、double這么多種類呢?為啥不只用一種數(shù)據(jù)類型來表示呢?
——這個(gè)問題問得好(精神分裂ing)。單看英文字母和中文字符的復(fù)雜程度應(yīng)該不難猜想:不同字符在計(jì)算機(jī)中所占大小是不同的,讓我簡要介紹計(jì)算機(jī)中的儲存單位:最小的單位是bit,8bit = 1Byte,1024Byte = 1KB,接著是MB,GB,TB等。bit(比特)是最小單位。這里說個(gè)題外話,不少人在辦理寬帶有這樣的困惑:為什么我明明買的是200M寬帶呀,為什么最高才十幾二十兆每秒呢?原因是:運(yùn)營商所宣傳的200M寬帶實(shí)際上是寬帶接入的速率為200Mbps,這里的B指的是Byte(字節(jié)),換算下來200M寬帶理論上峰速為25.6MB/s。這不重要,知道就好,讓我們跳回來。事實(shí)上,不同數(shù)據(jù)類型在內(nèi)存中所占大小是不一樣的,如果用大小的盒子裝蛋糕,蛋糕有大有小,難免造成空間的浪費(fèi),所以人們規(guī)定了不同的數(shù)據(jù)類型,以便空間被物盡其用。
在這里有一個(gè)很重要的思想,我稱之為黑屋思想:把內(nèi)存想象成一個(gè)個(gè)小黑屋,里面存放著我們想要存進(jìn)的東西,也存著我們不能動的東西,當(dāng)然也存著我們想取的東西。
2.1 數(shù)據(jù)類型的長度這里用sizeof()判斷數(shù)據(jù)類型或者表達(dá)式長度的運(yùn)算符,sizeof()不是函數(shù),后面會介紹(好像也沒什么介紹的= =)。
C語言規(guī)定sizeof(long long) >= sizeof(long),其他以此類推,上面的結(jié)果因編譯器和操作平臺而異。
3. 變量 && 常量生活中的有些值是不變的(比如:圓周率,性別,身份證號碼,血型等等)
有些值是可變的(比如:年齡,體重,薪資)。
如 3.2.1圖
格式如下:變量類型? (空格)變量名(自己起);
最好初始化變量,避免臟數(shù)據(jù)影響后續(xù)調(diào)試,如 int a = 0;如果變量名有實(shí)際含義,最好用對應(yīng)的英文(再不行就拼音,或英文簡寫)表示,后續(xù)也會明白。??
3.2?變量的分類?1.局部變量 && 全局變量
顧名思義,全局變量就是整個(gè)工程都能用的,而局部變量只能在{}內(nèi)部使用,這里的{}不僅限于主函數(shù)的大括號,在后面的循環(huán)或判斷語句中的{}也同樣適用。
//如果全局變量和局部變量名字一樣呢?是誰起作用呢?
顯然,在這里局部變量會覆蓋掉同名的全局變量。?
這里簡要介紹printf(),scanf()函數(shù),顧名思義,前者是打印,后者是掃描,讀?。╢是函數(shù)的意思),從鍵盤讀取輸入,它們是被包含在stdio.h頭文件中的。gets() && puts()也用同樣的功能,具體差異會在后續(xù)文章解釋。
3.3?變量的作用域和生命周期1.變量的作用域
作用域(scope,這個(gè)詞要記住,后面編譯器報(bào)錯可能會出現(xiàn))是程序設(shè)計(jì)概念,通常來說,一段程序代碼中所用到的名字并不總是有效/可用的,而限定這個(gè)名字的可用性的代碼范圍就是這個(gè)名字的作用域。
1. 局部變量的作用域是變量所在的局部范圍。(就是大括號里邊的變量只能在大括號里用)
2. 全局變量的作用域是整個(gè)工程。(就是大括號外邊的變量在哪都能用)? ? ? ? ? ? ? ? ? ??
2.生命周期
變量的生命周期指的是變量的創(chuàng)建到變量的銷毀之間的一個(gè)時(shí)間段
1. 局部變量的生命周期是:進(jìn)入作用域生命周期開始,出作用域生命周期結(jié)束。(大括號大括號!)
2. 全局變量的生命周期是:整個(gè)程序的生命周期。 (在哪都行!)? ?
§ 看完了嗎?用人話來說作用域就是變量在哪能用,生命周期就是它啥時(shí)候產(chǎn)生,啥時(shí)候消失。
3.4常量 1.字面常量是指可以用字符串表示的常量,包括整型常量,字符型常量,字符串常量,也可以是結(jié)構(gòu)型的符號常量。
2.const修飾的常變量首先來看沒有被修飾的變量:
顯然,未被修飾的變量的值是可以被改變的
再來看被const修飾的變量
編譯器告訴我們,a的值是不能改變的,也就是說,它是個(gè)常量,但不完全是,人們把它稱為常變量。原因是:用const修飾的變量只是在語法上將它作為常量,但它本質(zhì)還是變量,了解即可。?
(新增于22/10/3)
? 關(guān)于“常變量”的理解:用 const 修飾的變量,無論是全局變量還是局部變量,生存周期都是程序從運(yùn)行開始到運(yùn)行結(jié)束,也就是說,使用 const 修飾過的局部變量有了「靜態(tài)特性」。什么變量具有靜態(tài)屬性?我們知道全局變量是靜態(tài)的,靜態(tài)的生存周期就是程序運(yùn)行的整個(gè)過程。但是一定要區(qū)分的是:用const修飾過的局部變量只是有了「靜態(tài)特性」,并沒有說它變成了「靜態(tài)變量」。
? 之所以把const放在最后,是因?yàn)槔斫馑摹胳o態(tài)特性」需要理解全局變量和局部變量。
3.#define定義的標(biāo)識符常量看圖里的代碼可以知道:格式:#define 常量名 值,在這里常量名和值之間不需要等號。
4.枚舉常量#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
假設(shè)我們要用到星期一到星期五7個(gè)變量,如果用#define的方法定義變量,我們需要用7行代碼,而使用enum(枚舉)常量能用更少的代碼表示相同的意思。
enum DAY
{
MON = 0, TUE, WED, THU, FRI, SAT, SUN
};
第一個(gè)枚舉成員的默認(rèn)值為整型的 0,(在這里我用 = 0來表示,實(shí)際上它被省略了)后續(xù)枚舉成員的值在前一個(gè)成員上加 1,以此類推。
當(dāng)然我們可以在定義時(shí)修改任意枚舉成員的值:
enum DAY
{
MON = 1, TUE, WED = 100, THU, FRI, SAT, SUN
};
對于沒有指定值的枚舉元素,其值為前一元素加 1。在這里TUE = 2, THU = 101,以此類推。
枚舉常量先介紹到這里,實(shí)際上初學(xué)者的后續(xù)項(xiàng)目中用得較少,至少我現(xiàn)在還沒遇到過(大一期末)。
打印結(jié)果如下:
4.字符串 && 轉(zhuǎn)義字符 4.1 字符串"hello world!"
形如這樣被雙引號擴(kuò)起來的一串字符稱為字符串。
在vs2019編譯器中鍵入以上代碼,按下f10鍵,依次點(diǎn)擊調(diào)試->窗口->監(jiān)視。結(jié)果如圖。
我在定義數(shù)組時(shí)并未初始化數(shù)組大小,因?yàn)榫幾g器會根據(jù)輸入的內(nèi)容判定數(shù)組大小。由監(jiān)視窗口中的值和類型欄中可以看出,雖然顯示的是相同的內(nèi)容,但是由雙引號引起的字符串多了一個(gè)'\0',它在數(shù)組中是有實(shí)際大小的。由于人們要對字符串進(jìn)行一系列的處理,但是我們不是每次都能知道一個(gè)文本中的字符個(gè)數(shù),若要對處理它,很難保證不越界且不浪費(fèi)內(nèi)存,于是人們想到將'\0'當(dāng)作字符串結(jié)束的標(biāo)志(它是一個(gè)轉(zhuǎn)義字符,后面會介紹),這樣人們在處理字符串的時(shí)候就不必?fù)?dān)心數(shù)組越界和未知長度的問題了。
接下來我們定義三個(gè)數(shù)組,arr1是一個(gè)字符串,arr2和arr3都是字符數(shù)組,它們的區(qū)別在于arr2沒'\0',而arr3有,這樣的區(qū)別會帶來怎樣的影響呢?讓我們打印一下。?
結(jié)果非常的amazing啊,中間怎么有個(gè)奇怪的東西?
我們先看一樣的arr1和arr3,在監(jiān)視窗口中,它們包含的成員完全相同,當(dāng)然,我們可以認(rèn)為字符數(shù)組加上'\0'就是一個(gè)字符串,那為什么沒'\0'的字符數(shù)組arr2顯示出來但沒完全顯示出來呢?上面我們提到,'\0'是字符串的結(jié)束標(biāo)志(這里恰好證實(shí)了字符數(shù)組加上'\0'就是一個(gè)字符串這一猜想),打印函數(shù)只有碰到'\0'才會停下來,arr2數(shù)組里并不包含,所以機(jī)器就一直找呀找,找到別的小黑屋里去了,最終出現(xiàn)燙燙燙這樣的亂碼字符,以后你還會碰到錕斤拷(笑)。
用一張圖簡要表示數(shù)組在內(nèi)存中是如何被處理的。?
4.2 轉(zhuǎn)義字符當(dāng)我想打印路徑c:\code\test.c,結(jié)果為什么不是想象中的樣子呢?
這里就不得不提一下轉(zhuǎn)義字符了。轉(zhuǎn)義字符顧名思義就是轉(zhuǎn)變意思。
下面看一些轉(zhuǎn)義字符。
\' 表示單引號'
\" 表示雙引號"
\\表示一個(gè)反斜杠
\n表示換行
\r表示回車
\t表示水平制表符,相當(dāng)于按下tab鍵,還有一些轉(zhuǎn)義字符沒有提及,因?yàn)閯傞_始用的很少
補(bǔ)充一下ASCII碼表
簡單來說,因?yàn)闄C(jī)器內(nèi)存中只能存儲二進(jìn)制0和1,所以當(dāng)我們想要使用各式各樣的符號時(shí),只要使用對應(yīng)的ASCII碼,編譯器會將它們轉(zhuǎn)換成二進(jìn)制編碼,進(jìn)而被機(jī)器識別?,F(xiàn)在請將0,a,A對應(yīng)的ascii碼值記住。?
5. 判斷&&選擇語句?1. if語句
從字面上看容易理解:如果怎樣就執(zhí)行,不怎樣就不執(zhí)行。格式如下:
if(判斷條件)
{
執(zhí)行內(nèi)容
}
如果沒有{},if語句只執(zhí)行緊跟它的第一個(gè)語句,因?yàn)?;"表示執(zhí)行語句的終止。所以if語句和后面的各種語句,即使要執(zhí)行的語句只有一句,也要加上花括號,以便以后更好地維護(hù)程序,也增加了程序的可讀性。
人們規(guī)定判斷結(jié)果為真的表達(dá)式的值為1,否則為0;
2. if...else語句
一個(gè)?if 語句?后可跟一個(gè)?else 語句,else 語句在它之后的語句結(jié)果為假時(shí)執(zhí)行。
#includeint main()
{
int n = 0;
if (n == 0)
{
printf("hello\n");
}
else
{
printf("world\n");
}
return 0;
}
顯然,打印結(jié)果為hello。
3.if...else if...else 語句
一個(gè)?if?語句后可跟一個(gè)?else if...else?語句。
我把格式改成這樣:? ?if...(else if) * n...(else) * m?
n >= 0 ,m = 0或1;
三個(gè)部分都最好加上花括號。
也就是說,else if可以沒有,else也可以沒有,但是else if有大于0個(gè)時(shí),必須有else。且else必須在最后。這里的各個(gè)else if互不干擾,只要條件符合,就執(zhí)行語句后括號的內(nèi)容,判斷的變量必須與if括號中的一致。
int main()
{
int a = 1, b = 0;
if (a == 1)
{
printf("a\n");
}
else if (b == 0) //這里改變了變量
{
printf("b\n");
}
else
{
printf("no\n");
}
return 0;
}
當(dāng)然,if語句還可以嵌套,由于這是初始C,時(shí)間和篇幅有限,后面再介紹。
4.?switch?語句
先來個(gè)小總結(jié)
(1) switch括號內(nèi)的常量表達(dá)式,必須是一個(gè)整型或枚舉類型(上面有提到)。
(2) case 語句可以有任意個(gè),case 后跟一個(gè)對應(yīng)switch括號內(nèi)相同數(shù)據(jù)類型的值和一個(gè)冒號(前面需要一個(gè)空格)。
(3) 當(dāng)case內(nèi)的浴具語句執(zhí)行完畢后,如果未遇到break,將會繼續(xù)執(zhí)行下一個(gè)語句,直到遇見break或直到switc語句終止。當(dāng)然,break不是必要的。
(4) default語句 用于switch接收的常量或枚舉類型都不等于上面case語句冒號后的常量或枚舉常量,同樣,default也不是必要的。
(5) case語句和default語句后最好加上花括號。
看著真麻煩,話不多說,上代碼:(還是用截圖吧,看得清楚些)
這里打印結(jié)果為0,1,2?,是因?yàn)榈谝粋€(gè)case語句就像一個(gè)入口,如果沒遇到break,程序?qū)恢眻?zhí)行。這里的入口位置是任意的。
當(dāng)我修改n的值以后,對于此時(shí)的n,入口發(fā)生改變了。
當(dāng)我再次修改變量n的值且加入default語句結(jié)果如上。因?yàn)樯厦娴腸ase語句中沒有對應(yīng)的入口,只能通過default進(jìn)入switch語句。
當(dāng)然,switch語句也可以嵌套。
5. 循環(huán)前面我們依次簡要介紹了順序結(jié)構(gòu)、選擇結(jié)構(gòu),接下來我們要介紹循環(huán)結(jié)構(gòu)。
此處算是C的難度上升期,對于筆者而言,它大概是這樣的:
可能對大多數(shù)初學(xué)者并沒有這么夸張,但筆者當(dāng)初初學(xué)循環(huán)時(shí),似乎因?yàn)樽吡艘粫?,之后的就懵懵懂懂,一知半解,在?shí)驗(yàn)課束手無策,甚至一度懷疑自己的智商是否是編程這塊料,如此惡性循環(huán)。好在經(jīng)過我的惡補(bǔ)還有許多練習(xí),使我稍微掌握了循環(huán)結(jié)構(gòu)的使用。我從這里悟到一個(gè)編程學(xué)習(xí)者必須具備的素質(zhì),不要光聽不做,不要眼高手低,動手實(shí)踐才是真正學(xué)習(xí)編程??!
在這里再插一句:當(dāng)你遇到bug時(shí),盡量先自己找bug,因?yàn)橹挥薪?jīng)歷過痛苦才會刻骨銘心。
1. for循環(huán)我相信讀者比我更聰明,且看介紹。
規(guī)范、易讀的寫法如上,也可以在for后的括號定義計(jì)數(shù)器變量。但有些編譯器會報(bào)錯。
也可以這樣寫:
計(jì)數(shù)器初始化在for循環(huán)外也可,計(jì)數(shù)器變化在花括號內(nèi)也可,由上可知:for括號內(nèi)的兩個(gè)頓號是必須要寫的的,且不論執(zhí)行語句有多少,最好加上花括號。
在這里有個(gè)初學(xué)者經(jīng)常犯的錯誤:計(jì)數(shù)器的位置。
首先說一下機(jī)器執(zhí)行for循環(huán)的順序(常規(guī)結(jié)構(gòu)):?
也就是說,for后面括號內(nèi)語句的執(zhí)行并不是完全按順序的。當(dāng)我把計(jì)數(shù)器i++放在花括號內(nèi),且把它放在不是最后的位置,那它就不是最后執(zhí)行的語句了,所以要讓它作為計(jì)數(shù)器,就要把它放在最后。但是筆者認(rèn)為這樣的可讀性不算好,也不是很美觀,非必要情況下還是把計(jì)數(shù)器放在括號里吧。
計(jì)數(shù)器的地位舉足輕重,如果沒有它,條件判斷的結(jié)果永為真,這將是一個(gè)死循環(huán)。并不是所有的死循環(huán)都是錯誤的,因?yàn)槲覀兛傆行┦虑樾枰獧C(jī)器一直執(zhí)行,后面我們會用更簡潔的形式實(shí)現(xiàn)死循環(huán)。只有當(dāng)條件判斷的結(jié)果為假時(shí),循環(huán)才會停止。
for循環(huán)括號內(nèi)的判斷語句至少寫一句,很多時(shí)候,我們要在for循環(huán)語句內(nèi)添加判斷語句,其實(shí)也可以將?判斷語句寫在上面的括號內(nèi),不過這樣寫還是可讀性不是很好,也不算美觀(至少對初學(xué)者是這樣的),知道即可。
? 在這里強(qiáng)調(diào)一下計(jì)數(shù)器初始化的重要性:
? 我用兩個(gè)相同的循環(huán)結(jié)構(gòu),是否能打印兩組"1 2 3 4 5"呢??
從圖上我們知道,只打印了一組,我們把第二個(gè)條件判斷改一下:
兩個(gè)循環(huán)結(jié)構(gòu)我都沒有初始化計(jì)數(shù)器,當(dāng)然,對于第一個(gè)循環(huán)實(shí)際上它已經(jīng)在定義變量i時(shí)被初始化了。當(dāng)程序走完第一個(gè)循環(huán)結(jié)構(gòu)時(shí),i的值為6(以為是5的同學(xué)再思考一下),所以第二個(gè)循環(huán)打印不出來值,因?yàn)?>5,所以第二個(gè)循環(huán)根本進(jìn)不去,于是程序終止。??????
? 解決它有兩個(gè)辦法:
(1)定義不同變量用于不同計(jì)數(shù)器,這樣各個(gè)計(jì)數(shù)器之間就不會互相干擾了。?
(2)每次使用計(jì)數(shù)器之前都初始化它,即使用規(guī)范格式。
?這個(gè)小問題,每隔一段時(shí)間就會讓我惱火一陣子,有時(shí)是真的找不出來錯誤,因?yàn)槲也皇敲看螌懙母袷蕉际且粯拥?,所以說規(guī)范地寫代碼很重要??!??
2. while循環(huán)結(jié)構(gòu)如下:
計(jì)數(shù)器的位置同樣會影響打印結(jié)果。?
可以發(fā)現(xiàn),while循環(huán)只不過是把條件判斷留在了括號中,變量初始化和計(jì)數(shù)器放在了其他地方。
用法和注意點(diǎn)與for循環(huán)大致相同,區(qū)別在今后的博客中細(xì)說。
3.do...while語句目前不太需要,一般用在菜單選項(xiàng)的時(shí)候,到時(shí)候就知道了。
學(xué)??荚嚨囊c(diǎn):
int i = 0;
do
{
i++;
}while(...)
如果while括號中結(jié)果為假,do中的操作都是一定先執(zhí)行的,也就是說do...while循環(huán)至少執(zhí)行一次。?
6. 函數(shù)個(gè)人理解?
這里的函數(shù)不是數(shù)學(xué)中的函數(shù),不太喜歡數(shù)學(xué)的同學(xué)先別關(guān)掉:D。在我看來,函數(shù)就像生活中的各種店鋪,五金店,電器維修店,服裝店......它們在我們生活中有著各自的作用。函數(shù)的作用就像一個(gè)個(gè)店鋪,把各種具有不同功能的代碼打包,就像店鋪之間都隔著墻一樣。這樣的好處是簡化代碼。試想各種店鋪混在一起的場景,且結(jié)合筆者下面的解釋,應(yīng)該大致能理解函數(shù)的作用。
舉個(gè)栗子
這里只是舉一個(gè)十分簡單的例子,我想說的是:某些功能實(shí)現(xiàn)起來并不難,但實(shí)際上往往需要多次使用該功能,由于懶是第一生產(chǎn)力(:D),于是函數(shù)誕生了。
函數(shù)名括號內(nèi)的東西就相當(dāng)于店鋪門,你往門里丟東西,它就會根據(jù)它對應(yīng)的功能返回給你相應(yīng)的東西。函數(shù)先介紹到這里,后續(xù)會詳細(xì)講。
(新增于22/9/1)輸入輸出函數(shù):
? 通過上面對眾多語法的解釋,我經(jīng)常使用printf()函數(shù)來打印,其實(shí)以后如果遇到某些問題難以解決,通過“打印大法”經(jīng)常能化險(xiǎn)為夷,快速定位問題。(扯遠(yuǎn)了),現(xiàn)在列舉幾種C語言輸入輸出需要注意的方面和它們的常見用法。
要點(diǎn):
常見用法:
? 下面通過輸入輸出的幾種組合解釋:
請注意:如果你現(xiàn)在不知道輸入輸出語句,那就先記住它的格式,雙引號,逗號,括號什么的。
運(yùn)行以上代碼,會有一個(gè)光標(biāo)在閃動,輸入100,回車。代碼中打印了三次,不同的是第二次,添加了一個(gè)換行符。其中輸入語句中最后的是&(取地址),現(xiàn)在只要記住輸入要這個(gè)符號即可。
用其他的呢?
? 運(yùn)行上述程序,輸入6699回車,且不論打印的數(shù)字位置如何,它們卻只有2位。原因是:可以把輸入輸出語句中的雙引號以及它里面的東西翻譯成“格式”,輸入輸出就是按格式走的,是強(qiáng)制的。
? 這個(gè)%多少d,“多少”代表寬度,你看即使我輸入4個(gè)數(shù)字,那它也只讀取前兩個(gè)數(shù)字。下面兩個(gè)數(shù)字位置不同的原因是:打印函數(shù)的寬度正數(shù)靠右,負(fù)數(shù)靠左。如果沒有規(guī)定寬度,那么也就沒有絕對的靠右靠左對齊可言,不過從左到右習(xí)慣來講,不規(guī)定寬度默認(rèn)是靠左的。請注意對齊是在有移動空間的前提下才會體現(xiàn)出來。就像后面兩個(gè)打印函數(shù),長度(絕對值)都是4,是大于讀取的2位數(shù)字的長度的。
再來一個(gè)!
運(yùn)行上面的程序,但是請注意打印的格式與要打印的變量的類型不符合,就這段代碼而言,打印的是'A'和'B'的ASCII碼(還記得a的ASCII碼么?)。從格式上的強(qiáng)制性來說,規(guī)定打印的格式十分重要,不是說一定要類型符合,經(jīng)常是靈活使用。比如有一些題比如就是要打印字符的ASCII值,那么直接以%d打印字符就ok;再比如可能要遍歷A~Z,直接在循環(huán)65~106中用%c打印即可。
最后一個(gè)!
? 運(yùn)行程序。這次打印的是一個(gè)浮點(diǎn)數(shù),通過最后一個(gè)打印語句可以知道,%f默認(rèn)打印的是?保留6位小數(shù)。而在百分號和f之間的'.2'就代表小數(shù)點(diǎn)后保留兩位。經(jīng)常會在寫應(yīng)用題的時(shí)候遇到保留xx位小數(shù)這樣的要求。
在這里再次強(qiáng)調(diào)動手做的重要性,看得懂連入門都不算,當(dāng)然動手也需要熟練~
7. 數(shù)組數(shù)組的定義:一組相同類型元素的集合?
1. 一維數(shù)組?聲明&&初始化數(shù)組
從左至右依次為數(shù)組數(shù)據(jù)類型,數(shù)組名,數(shù)組元素個(gè)數(shù),數(shù)組元素。?
在這里,"[ ]"內(nèi)的數(shù)字可以不用寫
,編譯器會根據(jù)元素個(gè)數(shù)來改變它
數(shù)組的下標(biāo)
即數(shù)組的下標(biāo)是從0開始的,這點(diǎn)需要初學(xué)者下意識地在練習(xí)中成為肌肉記憶。
數(shù)組的使用?
數(shù)組的使用,單看它的形式,也就[]內(nèi)的數(shù)字可以變化,當(dāng)我想把數(shù)組中的元素打印出來呢
?????在這里,i的區(qū)間為[0,10),是有直觀意義的,它表示我們操作了數(shù)組中下標(biāo)為0到9的每個(gè)元素。
更多知識點(diǎn)與細(xì)節(jié)將在后續(xù)發(fā)出~
8. 操作符(簡單介紹)
算數(shù)操作符和賦值操作符的前五個(gè)相信大家都知道,這里提一下位操作符'&',當(dāng)我們每次使用scanf函數(shù)時(shí),總是要在變量名前加上&,&變量a的意思是取變量a的地址,這是&符號的作用之一。
對于上面的單目操作符和關(guān)系操作符,我們可能對解引用操作符不太熟悉(*),它和剛才提到的&符號取變量地址是對應(yīng)的,例如:*a = &a,它們是完全等價(jià)的。不太明白沒關(guān)系,這里以后會重點(diǎn)講。
這個(gè)條件操作符我們總是不容易想到,不經(jīng)常使用,但有時(shí)它能有種四兩撥千斤的效果,能簡化不少。
這個(gè)操作符的意思是:當(dāng)表達(dá)式一的結(jié)果為真,整個(gè)表達(dá)式結(jié)果就為表達(dá)式2,否則結(jié)果為表達(dá)式3。例如:
逗號表達(dá)式的意思就是一個(gè)語句由N個(gè)被逗號分隔的子語句(實(shí)際上不能稱之為語句)組成,那么這個(gè)語句的結(jié)果就為最后一個(gè)子語句的結(jié)果。例如:
9. 常見關(guān)鍵字關(guān)鍵字在此只介紹初學(xué)時(shí)重要、常見的幾個(gè)。
1. break在switch選擇語句使用的尤其多,其次是循環(huán)語句中。它的作用是一旦條件符合,就跳出整個(gè)循環(huán)or選擇語句。例如:
在這里唯一的不同是在a = 2后加了break,它的作用是阻止語句往下執(zhí)行。也就是說,switch語句要么從入口一直執(zhí)行完畢,要么從入口開始執(zhí)行,直到遇到break終止。
循環(huán)例子如下:
2. continue?它常用于循環(huán)語句中。它的作用是當(dāng)符合條件時(shí),continue后面的語句不再執(zhí)行,跳出本次循環(huán),再開始下一次循環(huán)。
例如:
理解了break,continue自然不難理解。
當(dāng)然,break和continue在不同情況下的差異會在后續(xù)詳細(xì)講。
3.?static在C語言中:
static是用來修飾變量和函數(shù)的
(1). 修飾局部變量
由第二次的結(jié)果來看,函數(shù)內(nèi)的局部變量并沒有像第一次一樣,每次調(diào)用都是為變量i開辟內(nèi)存空間,而是將變量i的值保存下來。
故:
static修飾局部變量改變了變量的生命周期,讓靜態(tài)局部變量超出了作用域后依然存在,直到程序結(jié)束時(shí),生命周期才結(jié)束。
(2). 修飾全局變量
這個(gè)例子舉起來有些麻煩,姑且讓我說說吧:在實(shí)際項(xiàng)目中,一個(gè)工程中會有至少一個(gè)源文件(xxx.c)。當(dāng)一個(gè)全局變量被static修飾,這個(gè)全局變量就只能在本源文件內(nèi)使用,不能在其他源文件內(nèi)使用。(此處忘記全局變量的同學(xué)往上翻^_^)
(3). 修飾函數(shù)
同上,一個(gè)函數(shù)被static修飾,這個(gè)函數(shù)就只能在本源文件內(nèi)使用,不能在其他源文件內(nèi)使用。
10. 指針指針和內(nèi)存管理是C語言的雙刃劍。
由于這部分十分重要,所以這里我簡要介紹有關(guān)指針的基礎(chǔ)知識。
1. 內(nèi)存
內(nèi)存是電腦上特別重要的存儲器,計(jì)算機(jī)中程序的運(yùn)行都是在內(nèi)存中進(jìn)行的 。所以為了有效的使用內(nèi)存,就把內(nèi)存劃分成一個(gè)個(gè)小的內(nèi)存單元,每個(gè)內(nèi)存單元的大小是1個(gè)字節(jié)。為了能夠有效的訪問到內(nèi)存的每個(gè)單元,就給內(nèi)存單元進(jìn)行了編號,這些編號被稱為該內(nèi)存單元的地址。
變量是創(chuàng)建內(nèi)存中的(在內(nèi)存中分配空間的),每個(gè)內(nèi)存單元都有地址,所以變量也是有地址的。在前面我提到:*a = &a,為什么呢?
? 對于等號右邊,它表示的是變量a的地址,它也是一個(gè)具體的值,我得用房間給它住,所以人們規(guī)定定義int?*a存放a的地址。注意:?在定義指針變量時(shí),*符號只是表示定義的是一個(gè)指針變量,而使用指針變量時(shí)*a中的*符號指的是機(jī)器通過存放的a的地址找到a的值。
1.1?指針的簡單使用
通過地址的存放,解引用,達(dá)到了賦值的目的。?
11. 結(jié)構(gòu)體結(jié)構(gòu)體是C語言中特別重要的知識點(diǎn),結(jié)構(gòu)體使得C語言有能力描述復(fù)雜類型。比如描述學(xué)生,學(xué)生包含: 名字+年齡+性別+學(xué)號這幾項(xiàng)信息。這里只能使用結(jié)構(gòu)體來描述了。直接上圖:
聲明一個(gè)結(jié)構(gòu)休類型的一般形式如下:
struct 結(jié)構(gòu)體名
{成員列表};
? 這個(gè)結(jié)構(gòu)體名在本工程中就是一個(gè)用戶定義的數(shù)據(jù)類型了,就像int那樣,不過需要注意的是,定義并初始化結(jié)構(gòu)體時(shí),成員的數(shù)據(jù)類型要于結(jié)構(gòu)體聲明時(shí)對應(yīng)。
? 細(xì)心的同學(xué)會發(fā)現(xiàn),我兩次打印時(shí),后面的一坨東西看起來不一樣,但結(jié)果卻完全一致。實(shí)際上這與指針有關(guān),在后面也會詳細(xì)講。
四、?總結(jié)? 關(guān)于反思。?
不知道有沒有細(xì)心的同學(xué)發(fā)現(xiàn)我的文章寫了很久:21_12_26 ->22_1_18,實(shí)際寫的天數(shù)大概小于10天左右。起初只是為了為迎接期末考試而寫的博客,本來是要從頭到尾都寫一遍了,結(jié)果發(fā)現(xiàn)太長太長了,所以我把題目改成了“C語言初階”,即使這樣,我還是沒辦法在考試之前寫完它,因?yàn)?號就考完了,直到13號放假回家?,F(xiàn)在已經(jīng)是23:33了,我在家玩了3天,拖延癥真的不好啊,百害無利的那種。太容易讓人泄氣了,惡性循環(huán)。
這篇文章我覺得它爛尾了,函數(shù)前面的部分,我寫的時(shí)候是充滿熱情的,總是愿意抽出時(shí)間寫。現(xiàn)在一閑下來,回到家,只要一開始玩就很難停下來(不過比沒我以前那么夸張),好在我堅(jiān)持了下來,終于寫完它了。在玩的時(shí)候如果去想著學(xué)習(xí),對于我來說一定是十分痛苦的,幸運(yùn)的是,每當(dāng)我投入時(shí)我是感到快樂的,因?yàn)檫@是我喜歡的事!
看了自己上面寫的東西,感覺文不對題(因?yàn)槲腋牧祟}目),好多廢話,想重新寫,但是上面的絕大部分都是我敲出來的,耗費(fèi)了我不少精力和時(shí)間,有頭有尾地做事(瞧瞧這像是拖延癥晚期的人說的話嗎),如果我把它就這樣擱置了,我會難過很久的,因?yàn)槲矣掷速M(fèi)了時(shí)間。由于前面的內(nèi)容沒有必要的內(nèi)容太多,且這篇寫這篇博客的目的是讓讀者初識C,也就是能看得懂代碼,沒有必要記憶太多東西,不過也好,前面的東西相對來說對初學(xué)者十分重要,講詳細(xì)點(diǎn)也并非沒有好處。不知道讀者的意見如何呢?歡迎評論!
寫在最后【建議】【學(xué)習(xí)、生活、人生計(jì)劃、心得】? 時(shí)間真快,我的大學(xué)生活已經(jīng)已經(jīng)過了1/3了,大四我不算在內(nèi),因?yàn)槲矣X得前三年是這輩子(students in CN)唯一能夠用一大把可自由支配的時(shí)間用來提升自己、尋找/做自己熱愛的事情的時(shí)間段了,其他時(shí)間段跟這個(gè)階段比可能沒那么純粹。如果你現(xiàn)在(準(zhǔn))大一/大二,千萬要做自己的主人——自信、勇敢、獨(dú)立是剩下的人生需要具備的,你我聽過許多道理,一起進(jìn)步吧。
【學(xué)習(xí)】
? 從大一萌新到現(xiàn)在的大二“老油條”,有不少事情我認(rèn)為越早知道越好:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 已經(jīng)深夜,持續(xù)更新--2022/9/1
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站標(biāo)題:C語言初階——手把手教零基礎(chǔ)/新手入門(萬字心得筆記)-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://www.rwnh.cn/article24/pgoce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、云服務(wù)器、網(wǎng)站維護(hù)、搜索引擎優(yōu)化、網(wǎng)站排名、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容