最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

計(jì)算機(jī)專(zhuān)業(yè):老師也許會(huì)跳過(guò)的 C 語(yǔ)言基礎(chǔ)知識(shí),趕緊補(bǔ)上一課!

2021-10-21 14:33 作者:C語(yǔ)言編程__Plus  | 我要投稿

對(duì)于理工科的大一新生來(lái)說(shuō),C 語(yǔ)言是個(gè)繞不開(kāi)的坎。由于在進(jìn)入大學(xué)前,許多人都完全沒(méi)有接觸過(guò)編程相關(guān)的內(nèi)容,導(dǎo)致對(duì)于這門(mén)課的接受能力普遍偏低,學(xué)起來(lái)也非常費(fèi)勁。這里就總結(jié)一些可能在課堂上老師不會(huì)詳細(xì)講解,但是對(duì)于理解 C 語(yǔ)言個(gè)人感覺(jué)比較重要的一些內(nèi)容,供大家參考討論。


首先我們來(lái)討論一些基礎(chǔ)的內(nèi)容。由于學(xué)校教學(xué)時(shí)長(zhǎng)是有限的,每節(jié)課的時(shí)間也比較短,因此在進(jìn)入具體教學(xué)前的緒論環(huán)節(jié),并不會(huì)花費(fèi)過(guò)多的筆墨。很多時(shí)候,甚至只會(huì)告訴同學(xué)如何安裝 IDE、如何新建文件、保存、編譯并運(yùn)行,但不會(huì)告訴同學(xué)們?yōu)槭裁匆@么做,每一步背后到底都干了些什么。要搞清楚這些問(wèn)題,首先需要知道一些編程語(yǔ)言的基本知識(shí),我們從分類(lèi)講起。

編程語(yǔ)言怎么分類(lèi)?

編程語(yǔ)言的分類(lèi)其實(shí)有很多種分類(lèi)方法,首先可以將其分為高級(jí)語(yǔ)言與低級(jí)語(yǔ)言,而高級(jí)語(yǔ)言之中又有著非常多的種類(lèi),這些將在下面進(jìn)行介紹。

高級(jí)語(yǔ)言與低級(jí)語(yǔ)言

首先按照高級(jí)低級(jí)來(lái)區(qū)分,可以分為機(jī)器語(yǔ)言(匯編語(yǔ)言)和其他。高級(jí)語(yǔ)言的分類(lèi)較多,這邊先簡(jiǎn)單聊一聊低級(jí)語(yǔ)言。

機(jī)器語(yǔ)言僅由?0?和?1?組成,是計(jì)算機(jī)硬件能夠直接理解的語(yǔ)言。不同的架構(gòu)——如我們熟知的 ARM,x86,RISC-V 等架構(gòu)——都有著不同的機(jī)器語(yǔ)言。機(jī)器語(yǔ)言能夠直接操作處理器,其操作碼在計(jì)算機(jī)內(nèi)都有著對(duì)應(yīng)的電路來(lái)完成。

匯編語(yǔ)言是在機(jī)器語(yǔ)言的基礎(chǔ)上誕生的一種語(yǔ)言,每一條語(yǔ)句都與機(jī)器語(yǔ)言中的操作碼一一對(duì)應(yīng),能夠直接翻譯到機(jī)器語(yǔ)言。其存在的意義就是能夠方便程序員理解。


上圖:匯編語(yǔ)言與機(jī)器語(yǔ)言對(duì)比

舉一個(gè)簡(jiǎn)單的例子:如果想要讓兩個(gè)數(shù)進(jìn)行加法運(yùn)算,例如計(jì)算?2+3?,那么使用機(jī)器語(yǔ)言可能就是?00000011 00000010 00000011?(這里為了方便加入了空格,實(shí)際的機(jī)器語(yǔ)言中不存在空格,只有?0?和?1?,且該機(jī)器碼為個(gè)人杜撰,僅作為例子使用,并非某一架構(gòu)實(shí)際所使用的機(jī)器碼),而用匯編語(yǔ)言寫(xiě)起來(lái)則是?ADD 2, 3?這樣較為便于理解的方式。當(dāng)然,匯編語(yǔ)言可不止這么簡(jiǎn)單,不過(guò)由于本文并非主要介紹匯編語(yǔ)言,因此就不進(jìn)行深入討論了。

盡管如此,匯編語(yǔ)言依然非常復(fù)雜,而且限制頗多,一旦需要寫(xiě)一些復(fù)雜功能,或是算法運(yùn)算,很容易寫(xiě)完后連自己都讀不懂。我在學(xué)習(xí)微機(jī)原理時(shí),寫(xiě)過(guò)一個(gè)課程項(xiàng)目,要求是用匯編為 89C51 單片機(jī)寫(xiě)一段搖一搖計(jì)數(shù)的代碼,剔除驅(qū)動(dòng) LCD 屏的代碼,總共不過(guò)四五百行,卻又寫(xiě)了近三百行注釋以便理解。雖然其中有我對(duì)于匯編不夠熟練的緣故,但其繁復(fù)程度可見(jiàn)一斑。

由此可見(jiàn),顯然不太可能用機(jī)器語(yǔ)言或是匯編語(yǔ)言來(lái)進(jìn)行復(fù)雜代碼的編寫(xiě)。這時(shí)高級(jí)語(yǔ)言就應(yīng)運(yùn)而生。下面就簡(jiǎn)單介紹一下高級(jí)語(yǔ)言以及其分類(lèi)。

編譯型、解釋型與混合型

接下來(lái)介紹通過(guò)語(yǔ)言的翻譯方式來(lái)進(jìn)行的分類(lèi),以三種目前非常流行的語(yǔ)言為例,分別為 C 語(yǔ)言,Python 以及 Java。

由于所有寫(xiě)的代碼最終都會(huì)變成機(jī)器語(yǔ)言才能執(zhí)行,因此不同的語(yǔ)言最終也會(huì)殊途同歸,翻譯回匯編和機(jī)器語(yǔ)言,只是不同類(lèi)型的語(yǔ)言翻譯的方式不同而已。這邊首先介紹 C 語(yǔ)言為代表的編譯型語(yǔ)言。

編譯型語(yǔ)言,顧名思義,就是通過(guò)編譯將代碼翻譯到機(jī)器語(yǔ)言,再進(jìn)行執(zhí)行,因此執(zhí)行前會(huì)首先將代碼進(jìn)行編譯,這一步在老師教學(xué)的時(shí)候,會(huì)告訴同學(xué)們必須要先點(diǎn)擊編譯再點(diǎn)擊執(zhí)行,或點(diǎn)擊編譯并執(zhí)行,其原因就在這里。編譯會(huì)調(diào)用現(xiàn)成的編譯器對(duì)代碼進(jìn)行分析,優(yōu)化,處理,其中的過(guò)程在這里由于篇幅原因也不過(guò)多贅述了,總之最后會(huì)將所寫(xiě)的?.c?代碼編譯為以?.exe(Windows 下)或?.out?(macOS 下)結(jié)尾可執(zhí)行文件。


C 語(yǔ)言編譯前


C 語(yǔ)言編譯后

這里可以控制編譯器生成匯編語(yǔ)言文件,可以看一下兩者的差距


上圖:C 語(yǔ)言與對(duì)應(yīng)匯編語(yǔ)言

顯然 C 語(yǔ)言的版本更容易理解。

編譯型語(yǔ)言雖然在會(huì)在執(zhí)行前進(jìn)行分析優(yōu)化,運(yùn)行起來(lái)速度也非常快,但對(duì)于大型程序來(lái)說(shuō),編譯耗時(shí)也會(huì)非常長(zhǎng)。那么能否不進(jìn)行編譯而直接運(yùn)行呢?答案顯然是可以的,這就是解釋型語(yǔ)言,如 Python。

對(duì)于解釋型語(yǔ)言,將不會(huì)使用編譯器進(jìn)行翻譯,最終生成機(jī)器語(yǔ)言的可執(zhí)行文件,再進(jìn)行執(zhí)行。它會(huì)調(diào)用解釋器,逐行翻譯源文件,將每一行實(shí)時(shí)翻譯到機(jī)器碼并執(zhí)行。如此一來(lái),就不需要進(jìn)行編譯,執(zhí)行前的準(zhǔn)備時(shí)間大大減少。但是由于解釋器并不會(huì)對(duì)代碼進(jìn)行優(yōu)化,而且每次運(yùn)行時(shí)都需要從頭解釋一遍,導(dǎo)致執(zhí)行效率不如編譯型語(yǔ)言。

編譯型語(yǔ)言還存在另一個(gè)問(wèn)題。根據(jù)前文所提到的,每種架構(gòu)都有獨(dú)特的機(jī)器語(yǔ)言,而編譯的過(guò)程就是將代碼翻譯為機(jī)器語(yǔ)言的過(guò)程,這就導(dǎo)致每次編譯生成的文件都只能在特定平臺(tái)上運(yùn)行。那能不能做到一次編譯,就能在全平臺(tái)運(yùn)行呢?顯然這也是可以的。這就是混合型語(yǔ)言,如 Java。

這類(lèi)語(yǔ)言同樣需要編譯,但是編譯后生成的并非機(jī)器碼,而是字節(jié)碼。通常這類(lèi)語(yǔ)言在運(yùn)行時(shí)會(huì)再轉(zhuǎn)換成機(jī)器碼執(zhí)行,或直接由虛擬機(jī)解釋執(zhí)行。由于編譯到字節(jié)碼而非機(jī)器碼,因而編譯得到的執(zhí)行文件是全平臺(tái)通用的。

指定數(shù)據(jù)類(lèi)型

許多同學(xué)在學(xué)習(xí) C 語(yǔ)言的時(shí)候可能會(huì)疑惑,數(shù)據(jù)類(lèi)型到底有什么用?要理解這個(gè)問(wèn)題,我們先來(lái)看看數(shù)據(jù)是怎么存儲(chǔ)的。

數(shù)據(jù)類(lèi)型的意義

在內(nèi)存中,所有數(shù)據(jù)都會(huì)被以二進(jìn)制進(jìn)行存儲(chǔ),即?01001001?等形式。這些數(shù)據(jù)僅僅只是?0?和?1?而已,所表達(dá)的意義都是人為規(guī)定的。

通常,第一位會(huì)被視為符號(hào)位,即?0?位正,?1?為負(fù)。然而,如果我希望第二位來(lái)表示符號(hào)位,也完全是符合規(guī)定的,只是所有涉及到運(yùn)算的代碼都要重寫(xiě)罷了。而數(shù)據(jù)類(lèi)型就是用來(lái)規(guī)定每一位所代表的意義。

舉個(gè)例子,在 32 位系統(tǒng)中,對(duì)于?int?類(lèi)型而言,第一位表示符號(hào),后 31 位表示具體的值。而對(duì)于?float?類(lèi)型而言,盡管第一位也表示符號(hào),但剩下的 31 位與?int?類(lèi)型所表示的意義就不同了。緊接著的 8 位是指數(shù)位,剩下的是尾數(shù),即使用科學(xué)計(jì)數(shù)法表示為?尾數(shù) * (2 ^ 指數(shù))?。這里是?2?的原因是計(jì)算機(jī)中所有數(shù)據(jù)都是二進(jìn)制存儲(chǔ)的,而非十進(jìn)制。


上圖:float 類(lèi)型存儲(chǔ)方式

這里用?0 10000010 00010000 00000000 0000000?來(lái)展示一下?float?類(lèi)型的具體計(jì)算。理解這段需要會(huì)一些簡(jiǎn)單的進(jìn)制轉(zhuǎn)換,如果不會(huì)建議自學(xué)一下。通過(guò)二進(jìn)制計(jì)算器,可以很容易得到它對(duì)應(yīng)的十進(jìn)制數(shù)是?1094975488?。

對(duì)于?float?類(lèi)型來(lái)說(shuō),其指數(shù)為?10000010?,即?129?,再根據(jù)規(guī)定減去?127?,最終得到其指數(shù)為?2?。對(duì)于尾數(shù)而言,由于一定由?1?開(kāi)頭,因此最開(kāi)始的這位?1?會(huì)被省略,因此其尾數(shù)實(shí)際為?10001000 00000000 00000000?,即為?1.0001 * (2 ^ 2)?,換算成十進(jìn)制為?4.25?。

如果希望對(duì)這兩個(gè)類(lèi)型的數(shù)據(jù)進(jìn)行簡(jiǎn)單的加法運(yùn)算,而不指定數(shù)據(jù)類(lèi)型,匯編中會(huì)直接進(jìn)行對(duì)位相加,即對(duì)應(yīng)的每一個(gè)?0?或?1?相加,并加上前一位的進(jìn)位。這樣計(jì)算會(huì)得到?10000010 00010000 00000000 00000000?,顯然不是我們想要的?1094975492.25?。

如果不指定數(shù)據(jù)類(lèi)型,計(jì)算就會(huì)得到錯(cuò)誤的答案。由此可見(jiàn),在內(nèi)存中無(wú)意義的一串二進(jìn)制數(shù),我們可以通過(guò)規(guī)定每一位的意義,來(lái)得到不一樣的結(jié)果。

為什么要指定這么多數(shù)據(jù)類(lèi)型

很多同學(xué)可能也有這樣的疑惑,為什么光一個(gè)整數(shù)就有?short?,?int?,?lang?三種,浮點(diǎn)數(shù)也有?float?,?double?兩種,甚至還有與?int?類(lèi)型對(duì)應(yīng)的?char?類(lèi)型呢?只需要?int?和?double?不就夠用了么?

由于現(xiàn)在的計(jì)算機(jī)內(nèi)存普遍充裕,不太會(huì)遇到內(nèi)存空間不足的問(wèn)題,因此可以直接選用高精度的數(shù)據(jù)類(lèi)型進(jìn)行存儲(chǔ)與計(jì)算。然而,在多年以前,或是在嵌入式領(lǐng)域,這類(lèi)存儲(chǔ)空間非常緊張的條件下,不同數(shù)據(jù)類(lèi)型的差距就顯現(xiàn)出來(lái)了。

由于在這些條件下,每一個(gè)?bit?都顯得彌足珍貴,因此程序員會(huì)想方設(shè)法地優(yōu)化存儲(chǔ)空間的使用,能夠用低精度的就不會(huì)用高精度。

而浮點(diǎn)數(shù)根據(jù)上文對(duì)存儲(chǔ)方式的解釋可以看出,精度越高,其所能表示的大小越小,因此在表示較大的,對(duì)精度要求高的數(shù)據(jù)時(shí),就必須使用高精度的數(shù)了,反之則可以用低精度的節(jié)省空間。由于?float?所能表示的精度實(shí)在是非常低,因此建議在學(xué)校編寫(xiě) C 程序時(shí),如無(wú)特殊要求,一律使用?double?類(lèi)型。

而?char?類(lèi)型則較為特殊,可以與整數(shù)類(lèi)型進(jìn)行相互轉(zhuǎn)換。在單片機(jī)等環(huán)境中,由于存儲(chǔ)空間有限,因此更傾向于使用?char?這一只消耗一字節(jié)的數(shù)據(jù)類(lèi)型,而不是?int?等更大的。另外,?char?一般用來(lái)表示字符,因此如果要表示例如?'A'?這種字符型的數(shù)據(jù)時(shí),一般用?char?類(lèi)型。?char?類(lèi)型在后文有關(guān)字符串的部分還會(huì)提到。

然而,?short?類(lèi)型不一定就比?int?類(lèi)型消耗的空間少,?long?也不一定就比?int?表示的精度高,一切由編譯器決定(只需要遵守?2 <= short <= int <= long?就是符合規(guī)定的)。因此如果真的有需要,可以用?char?來(lái)降低消耗,而不是使用?short?。


上圖:數(shù)據(jù)類(lèi)型在不同操作系統(tǒng)下的大小

由此可見(jiàn),雖然常用的數(shù)據(jù)類(lèi)型就這么幾個(gè),但是其他的類(lèi)型也都有其存在的意義,可以不用,但不能沒(méi)有。數(shù)據(jù)類(lèi)型一旦確定,該變量在內(nèi)存中所分配的大小,以及每一位所代表的意義,也就隨之確定下來(lái)了。

數(shù)組與指針

明白數(shù)據(jù)類(lèi)型,接下來(lái)就可以定義數(shù)組了。一個(gè)數(shù)組是由一定數(shù)量的,相同數(shù)據(jù)類(lèi)型的變量組成的一種數(shù)據(jù)結(jié)構(gòu),也就是說(shuō),一個(gè)數(shù)組可以由一定數(shù)量的其他數(shù)組組成,而這些數(shù)組也可以由數(shù)組組成,形成套娃。

在 C 語(yǔ)言中,數(shù)組在定義時(shí)必須顯式指定其長(zhǎng)度與數(shù)據(jù)類(lèi)型,而在一些其他語(yǔ)言——如 Java、 Python 中——可以不斷擴(kuò)展數(shù)組的長(zhǎng)度,但 C 語(yǔ)言中卻不能這樣做。這又是為什么呢?這需要從如何在內(nèi)存中生成一個(gè)數(shù)組說(shuō)起。

數(shù)組的生成

我們?cè)?C 語(yǔ)言中創(chuàng)建數(shù)組時(shí),會(huì)指定數(shù)組的數(shù)據(jù)類(lèi)型和長(zhǎng)度,而編譯器可以根據(jù)?數(shù)據(jù)類(lèi)型 * sizeof(數(shù)據(jù)類(lèi)型)?推算出這一數(shù)組具體需要占據(jù)多大的內(nèi)存空間,進(jìn)而在程序運(yùn)行到這一步,需要?jiǎng)?chuàng)建數(shù)組時(shí),為其在內(nèi)存中申請(qǐng)符合要求的,連續(xù)的一段空間進(jìn)行數(shù)組的生成。但為什么要連續(xù)的空間,而不能斷斷續(xù)續(xù)呢?

數(shù)組在訪問(wèn)時(shí),會(huì)首先找到其內(nèi)存地址。數(shù)組在創(chuàng)建時(shí)的變量名,實(shí)際也是一個(gè)指向數(shù)組第一項(xiàng)的一個(gè)指針(后面會(huì)講到)。隨后,根據(jù)具體訪問(wèn)哪一項(xiàng),如第 n 項(xiàng),就會(huì)將這一地址加上?n * sizeof(數(shù)據(jù)類(lèi)型)?,就能直接找到這一項(xiàng)的內(nèi)存地址。因此數(shù)組在生成時(shí)需要申請(qǐng)連續(xù)的內(nèi)存地址,否則就無(wú)法做到這么高效的訪問(wèn)速度。

C 語(yǔ)言中的數(shù)組與其他語(yǔ)言的數(shù)組

那么問(wèn)題來(lái)了:為什么別的語(yǔ)言能做到擴(kuò)展數(shù)組長(zhǎng)度,通過(guò)變量來(lái)初始化數(shù)組,而不是通過(guò)常數(shù)來(lái)指定呢?

事實(shí)上,在最底層的實(shí)現(xiàn)中,它們也是會(huì)指定一個(gè)具體的值來(lái)生成數(shù)組,其原理與 C 語(yǔ)言完全相同。但是在需要更長(zhǎng)的數(shù)組時(shí),會(huì)申請(qǐng)一段更長(zhǎng)的連續(xù)內(nèi)存空間來(lái)存放新數(shù)組,并將原來(lái)的舊數(shù)組完全復(fù)制一份過(guò)去。當(dāng)然,各種語(yǔ)言會(huì)存在一定的優(yōu)化,申請(qǐng)的空間會(huì)比所需的空間略大一些,防止重復(fù)不斷的復(fù)制降低運(yùn)行效率。


上圖:數(shù)組動(dòng)態(tài)擴(kuò)容

由于 C 語(yǔ)言的數(shù)組是最原始的數(shù)組,語(yǔ)言本身不會(huì)自行進(jìn)行申請(qǐng)新地址,復(fù)制舊數(shù)組等操作,因此需要在初始化時(shí)就指定好長(zhǎng)度。

指針的作用

另外一個(gè)初學(xué)時(shí)難以理解的概念就是指針了。 先來(lái)看下指針到底是什么。指針是一個(gè)存放內(nèi)存地址的變量,也就是說(shuō)可以直接訪問(wèn)并操作內(nèi)存。


上圖:指針示意圖

圖中?a?表示一個(gè)整數(shù)類(lèi)型的變量,值為 100,在內(nèi)存中存放在?0x0010?這一地址中。因此可以定義一個(gè)指針?x?指向這一地址??梢岳斫鉃?x?中存放了?0x0010?這一地址,訪問(wèn)這一指針就相當(dāng)于訪問(wèn)這一地址。這就引出了一個(gè)問(wèn)題:既然指針存放的是地址,訪問(wèn)的也是地址,那么為什么還要定義一個(gè)類(lèi)型呢?

原因很簡(jiǎn)單,因?yàn)橐〕鲈摰刂肪唧w存放的值。前面說(shuō)過(guò),數(shù)據(jù)類(lèi)型決定了該數(shù)據(jù)所占的大小,以及每一位具體所代表的內(nèi)容。因此,要取出該地址具體存放的值,必須要知道其數(shù)據(jù)類(lèi)型才行。這就是為什么 C 語(yǔ)言中定義指針時(shí)要指定數(shù)據(jù)類(lèi)型,指明該內(nèi)存地址存放數(shù)據(jù)的具體數(shù)據(jù)類(lèi)型。

指針與數(shù)組的關(guān)系

指針與數(shù)組的關(guān)系也非常緊密。定義數(shù)組時(shí)取的名稱(chēng)就是指向數(shù)組第一個(gè)元素的指針,也就是說(shuō),要訪問(wèn)數(shù)組?a?中的?a[0]?,可以直接訪問(wèn)?*a?。以此類(lèi)推,可以通過(guò)訪問(wèn)?*(a+1), *(a+2)來(lái)訪問(wèn)?a[1], a[2]?。這是因?yàn)樵诙x數(shù)組時(shí)已經(jīng)指定了數(shù)據(jù)類(lèi)型,因此這里的?+1?就不是簡(jiǎn)單的加法,而是在指針存儲(chǔ)的地址的基礎(chǔ)上,加上?sizeof(a[0])?(這里的?sizeof?用來(lái)獲取某一變量在存放時(shí)使用的內(nèi)存大?。?。從上圖可以看出,每個(gè)?int?類(lèi)型如果占了 4 個(gè)字節(jié),那么每次?+1?都會(huì)將內(nèi)存地址?+4?再訪問(wèn)。

需要注意的是,通過(guò)這種方式訪問(wèn)數(shù)組會(huì)有數(shù)組越界的問(wèn)題。也就是說(shuō),如果定義了一個(gè)長(zhǎng)為 n 的數(shù)組,但是通過(guò)?*(a+n)?來(lái)訪問(wèn)第 n+1 位,C 語(yǔ)言并不會(huì)有任何的錯(cuò)誤提示,只會(huì)返回一個(gè)存儲(chǔ)在該內(nèi)存地址的,根據(jù)定義的數(shù)據(jù)類(lèi)型來(lái)計(jì)算得出的值。很多情況下無(wú)法分辨到底是否越界,因此使用這種方式訪問(wèn)需要小心謹(jǐn)慎。

另外,雖然數(shù)組名是一個(gè)指針,但是是一個(gè)常量,因此不能給其賦值。

字符與字符串

之前提到,?char?類(lèi)型多用于表示字符。字符串是由字符組成的,其底層是一串由?char?類(lèi)型的變量組成的數(shù)組,因此可以通過(guò)?char*?或是?char[]?來(lái)生成字符串。賦值時(shí),可以通過(guò)數(shù)組一個(gè)一個(gè)字符賦值,也可以通過(guò)雙引號(hào)直接賦值。

在一些其他編程語(yǔ)言中,會(huì)專(zhuān)門(mén)有一個(gè)數(shù)據(jù)類(lèi)型?String?來(lái)表示字符串,但在 C 語(yǔ)言中并沒(méi)有。因此對(duì)字符串的處理就等價(jià)于對(duì)字符數(shù)組的處理。

在處理字符串時(shí)需要注意,數(shù)組長(zhǎng)度是包含最后的?\0?的,而?strlen?函數(shù)則不會(huì)。另外,如果通過(guò)數(shù)組的方式一個(gè)個(gè)添加字符,且在最后沒(méi)有加上?\0?,那么則由于數(shù)組越界進(jìn)而使得字符串中的數(shù)據(jù)出現(xiàn)錯(cuò)誤。為了防止出現(xiàn)這一錯(cuò)誤,最好直接通過(guò)雙引號(hào)進(jìn)行賦值。另外,不論字符數(shù)組有多長(zhǎng),第一次出現(xiàn)?\0?就代表著字符串的結(jié)束。

由于?char?實(shí)際就是一個(gè)數(shù)字,因此在解決如 大小寫(xiě)轉(zhuǎn)換 之類(lèi)的問(wèn)題時(shí),可以通過(guò)?+- 32?來(lái)解決。這里的 32 來(lái)自于 ASCII 碼表,每一個(gè)數(shù)字都對(duì)應(yīng)著一個(gè)字符。?碼表?可以在網(wǎng)上輕松找到。如果不記得具體的大小,可以通過(guò)格式化輸出?%d?直接查看對(duì)應(yīng)的數(shù)字,如果記不得大小寫(xiě)間差了 32,可以用?'a' - 'A'?來(lái)臨時(shí)湊合使用一下。

一些要注意的語(yǔ)法格式

老師可能不會(huì)著重提語(yǔ)法格式,但是實(shí)際上良好的格式能夠顯著提升代碼的可讀性,方便理解與找錯(cuò)。

main 函數(shù)

首先,根據(jù)?C99?標(biāo)準(zhǔn),?main?函數(shù)應(yīng)當(dāng)定義為?int main(void) {...}?或是?int main(int argc, char *argv[]) {...}?。前一種在現(xiàn)在學(xué)習(xí)的階段更為常用,其中的?void?一般是可以省略的。但是,最后的?return 0;?是可以被省略的,如果不寫(xiě)將會(huì)默認(rèn)返回 0。有些老師或者書(shū)上可能會(huì)寫(xiě)成?void main() {...}?,或是說(shuō)一定要顯示地寫(xiě)出?return 0;?。這些都是錯(cuò)誤的。具體標(biāo)準(zhǔn)可以參考?標(biāo)準(zhǔn)文檔?。


main 函數(shù)定義


上圖:main 函數(shù)返回值

縮進(jìn)

縮進(jìn)與換行的使用也是很重要的。?{?與?}?應(yīng)當(dāng)獨(dú)占一行,其中所包裹的內(nèi)容應(yīng)當(dāng)進(jìn)行一次縮進(jìn)。另外,盡管?if?語(yǔ)句或是?for?語(yǔ)句等,如果大括號(hào)內(nèi)只包含一條語(yǔ)句,很多老師會(huì)去掉大括號(hào),并寫(xiě)在一行內(nèi)。這并不是一個(gè)好習(xí)慣,應(yīng)當(dāng)照樣換行,加上大括號(hào)與縮進(jìn),方便閱讀與之后的修改。

可以使用在線格式化,或是?astyle?等格式化軟件來(lái)進(jìn)行代碼格式化。

其他一些小 tips

除了以上的這些老師可能會(huì)一筆帶過(guò)的內(nèi)容外,還有一些我在編程中所學(xué)到的一些小 tips:

Warning(敲代碼是不可忽略的警告)

希望所有看到這篇文章的、需要學(xué)習(xí) C 語(yǔ)言的同學(xué)們能夠順利學(xué)好這門(mén)課,取得一個(gè)好成績(jī)。

對(duì)于準(zhǔn)備成為一名優(yōu)秀程序員的朋友,如果你想更好的提升你的編程核心能力(內(nèi)功),讓自己成為一個(gè)具有真材實(shí)料的厲害的程序員,不妨從現(xiàn)在開(kāi)始!C/C++,永不過(guò)時(shí)的編程語(yǔ)言~

微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地

C語(yǔ)言零基礎(chǔ)入門(mén)教程(83集全)

整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)

歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!



計(jì)算機(jī)專(zhuān)業(yè):老師也許會(huì)跳過(guò)的 C 語(yǔ)言基礎(chǔ)知識(shí),趕緊補(bǔ)上一課!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
沾化县| 大丰市| 昌吉市| 安化县| 云林县| 古浪县| 乐清市| 防城港市| 刚察县| 旌德县| 西吉县| 信阳市| 荆门市| 昌江| 凤台县| 湟源县| 富顺县| 荥经县| 嘉峪关市| 循化| 聂荣县| 甘南县| 循化| 长白| 隆尧县| 日土县| 禄丰县| 博白县| 南郑县| 平塘县| 扶沟县| 鹿邑县| 衢州市| 吴忠市| 四会市| 沅江市| 靖宇县| 顺昌县| 潢川县| 吉隆县| 德庆县|