国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語言系統(tǒng)化精講(一):編程基礎(chǔ)

這篇具有很好參考價值的文章主要介紹了C語言系統(tǒng)化精講(一):編程基礎(chǔ)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文是正式進(jìn)入C語言學(xué)習(xí)的一道「開胃小菜」,并沒有涉及具體的語法,目的是讓讀者對編程的基本知識有所了解,并且告訴讀者如何少走彎路。大家在閱讀本文教程的時候請放松心情,不用死記硬背,理解即可。

一、計算機組成原理之計算機系統(tǒng)概述

參考文章:https://blog.csdn.net/xw1680/article/details/132596122

二、程序語言發(fā)展歷史

我們平時生活中說的是漢語,是 中國語言,只要把我們的要求告訴朋友們或者父母,他們就會知道我們表達(dá)的意思,進(jìn)而滿足我們的要求,我們使用 中國語言 來讓他人明白、理解我們要做的事情。

中國語言 有固定的格式,每個漢字代表的意思不同(中國文化博大精深,暗語),我們必須正確的表達(dá),別人才能理解我們的意思。如下:

例如: 劉老師,你真的好帥呀!

如果我們說 的好帥呀真你,老劉師,劉老師聽了之后就會覺得奇怪,聽不懂我們的意思,或者理解錯誤,責(zé)備我們。我們通過有固定格式和固定詞匯的 語言"控制" 他人,讓他人為我們做事情。語言有很多種,包括漢語、英語、法語、韓語等,雖然他們的詞匯和格式都不一樣,但是可以達(dá)到同樣的目的,我們可以選擇任意一種語言去 "控制" 他人。同樣,我們也可以通過 "語言" 來控制計算機,讓計算機為我們做事情,這樣的語言就叫做 編程語言(Programming Language)。下面就介紹編程語言的 發(fā)展歷史:

① 機器語言: 因為計算機只認(rèn)指令,在早些年前,就有機器語言,它以一種指令集體系結(jié)構(gòu)存在,數(shù)據(jù)能夠被計算機 CPU 直接解讀,不需要進(jìn)行任何的翻譯。計算機使用的是由 0和1二進(jìn)制數(shù) 組成的一串指令,如下圖所示:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
和自然語言完全不同,難于記憶和理解,工作量大,效率低,無法移植。

② 匯編語言: 機器語言的存在正好滿足了計算機的要求。但是編程人員使用機器語言很痛苦,于是匯編語言就應(yīng)運而生了。匯編語言是用英文字母或符號串來替代機器語言的二進(jìn)制碼 (即通過一組簡單的的符號來表示機器指令,更接近于自然語言,更容易理解和使用),這樣就把不易理解和使用的機器語言變成了匯編語言。因此,使用匯編語言就比機器語言便于閱讀和理解程序。如下所示是匯編指令:

mov ax,2000
mov ss,ax
mov sp,10

mov ax,3213
push ax
mov ax,3366
push ax

③ 高級語言: 匯編語言也有弊端,它的助記符多且難記(開發(fā)工作量大、難度高),而且匯編語言依賴于硬件系統(tǒng)(無法移植),于是,人們又發(fā)明了高級語言,高級語言的語法和格式類似于英文,遠(yuǎn)離了對硬件的直接操作。高級語言并不是某一種具體的語言,如下圖所示:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
如上圖所示,包括流行的C語言、Java、C++、Python等,本專欄我們不深入探討其他編程語言,只談C語言,這里簡單了解下每種語言擅長的方面,例如:

編程語言 主要用途
C/C++ C++ 是在C語言的基礎(chǔ)上發(fā)展起來的,C++ 包含了C語言的所有內(nèi)容,C語言是C++的一個部分,它們往往混合在一起使用,所以統(tǒng)稱為 C/C++。C/C++主要用于PC軟件開發(fā)、Linux開發(fā)、游戲開發(fā)、單片機和嵌入式系統(tǒng)。
Java Java 是一門通用型的語言,可以用于網(wǎng)站后臺開發(fā)、Android 開發(fā)、PC軟件開發(fā),近年來又涉足了大數(shù)據(jù)領(lǐng)域(歸功于 Hadoop 框架的流行)。
C# C# 是微軟開發(fā)的用來對抗 Java 的一門語言,實現(xiàn)機制和 Java 類似,不過 C# 顯然失敗了,目前主要用于 Windows 平臺的軟件開發(fā),以及少量的網(wǎng)站后臺開發(fā)。
Python Python 也是一門通用型的語言,主要用于系統(tǒng)運維、網(wǎng)站后臺開發(fā)、數(shù)據(jù)分析、人工智能、云計算等領(lǐng)域,近年來勢頭強勁,增長非???。
PHP PHP 是一門專用型的語言,主要用來開發(fā)網(wǎng)站后臺程序。
JavaScript JavaScript 最初只能用于網(wǎng)站前端開發(fā),而且是前端開發(fā)的唯一語言,沒有可替代性。近年來由于 Node.js 的流行,JavaScript 在網(wǎng)站后臺開發(fā)中也占有了一席之地,并且在迅速增長。
Go語言 Go語言是 2009 年由 Google 發(fā)布的一款編程語言,成長非常迅速,在國內(nèi)外已經(jīng)有大量的應(yīng)用。Go 語言主要用于服務(wù)器端的編程,對 C/C++、Java 都形成了不小的挑戰(zhàn)。
Objective-C Swift Objective-C 和 Swift 都只能用于蘋果產(chǎn)品的開發(fā),包括 Mac、MacBook、iPhone、iPad、iWatch 等。
匯編語言 匯編語言是計算機發(fā)展初期的一門語言,它的執(zhí)行效率非常高,但是開發(fā)效率非常低,所以在常見的應(yīng)用程序開發(fā)中不會使用匯編語言,只有在對效率和實時性要求極高的關(guān)鍵模塊才會考慮匯編語言,例如操作系統(tǒng)內(nèi)核、驅(qū)動、儀器儀表、工業(yè)控制等。

可以將上表中不同的編程語言比喻成各國語言,為了表達(dá)同一個意思,可能使用不同的語句。例如,表達(dá) 劉老師你好 的意思:

漢語: 劉老師你好
英語: Hello, Miss Liu
韓語: ? ???, ?????.

在編程語言中,同樣的操作也可能使用不同的語句。例如,在屏幕上顯示 劉老師你好

puts("劉老師你好"); //C語言
console.log("劉老師你好");//javascript語言
System.out.println("劉老師你好");//java語言
print("劉老師你好") //python語言

高級語言類似于人類語言,由直觀的詞匯組成,我們很容易就能理解它的意思,例如在C語言中,我們使用 puts(puts 是 output string(輸出字符串) 的縮寫) 這個詞讓計算機在屏幕上顯示出文字;使用 puts 在屏幕上顯示 劉老師你好

puts("劉老師你好");

我們把要顯示的內(nèi)容放在 ("") 之間,并且在最后要有 ; 你必須要這樣寫,這是固定的格式。

總結(jié): 編程語言是用來控制計算機的 一系列指令(Instruction),它有固定的格式和詞匯(不同編程語言的格式和詞匯不一樣),我們必須經(jīng)過學(xué)習(xí)才會使用,才能控制計算機。如果不嚴(yán)格遵守編程語言的語法規(guī)則,就會出錯,達(dá)不到我們的目的。

拓展:編譯型語言和解釋型語言的區(qū)別?

我們常常使用的計算機是不能理解高級語言的,更不能直接執(zhí)行高級語言,它只能直接理解機器語言,所以使用任何高級語言編寫的程序若想被計算機運行,都必須將其轉(zhuǎn)換成計算機語言,也就是機器碼。操作系統(tǒng)提供了兩種轉(zhuǎn)換方法:1. 編譯 2. 解釋。
所以高級語言也分為 編譯型語言和解釋型語言。 主要區(qū)別在于,前者源程序編譯后即可在該平臺運行,后者是在運行期間才編譯。所以前者運行速度快,后者跨平臺性好。
編譯性語言特點: 針對不同的平臺,需要使用對應(yīng)的編譯器,它可以將高級語言源代碼一次性的編譯成可被該平臺硬件執(zhí)行的機器碼,并包裝成該平臺所能識別的可執(zhí)行性程序的格式。總結(jié): 與特定的平臺有關(guān),在其他平臺使用,需要想辦法移植??梢跃幾g成平臺相關(guān)的機器語言文件,運行時脫離開發(fā)環(huán)境,運行效率高;
解釋性語言特點: 解釋器是對源程序逐行解釋成特定平臺的機器碼并立即執(zhí)行。是代碼在執(zhí)行時才被解釋器一行行動態(tài)翻譯和執(zhí)行,而不是在執(zhí)行之前就完成翻譯。總結(jié): 解釋型語言每次運行都需要將源代碼解釋稱機器碼并執(zhí)行,效率相對較低,但是書寫簡單。不同的平臺只要提供相應(yīng)的解釋器,就可以運行源代碼,所以可以方便源程序移植;
程序設(shè)計的步驟:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
說明:無論是高級程序設(shè)計語言還是專用程序設(shè)計語言,都不能被計算機系統(tǒng)直接識別,用這些語言所編寫的程序代碼稱為源程序,源程序需要通過預(yù)先設(shè)計好的專用程序進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為計算機系統(tǒng)可以識別的機器指令,然后才能交由計算機系統(tǒng)執(zhí)行。

C語言(C Language) 是高級程序設(shè)計語言的一種,學(xué)習(xí)C語言,主要是學(xué)習(xí)它的格式和詞匯。下面是一個C語言的完整例子,它會讓計算機在屏幕上顯示 劉老師,您好!。這個例子主要演示C語言的一些固有格式和詞匯,看不懂的讀者不必深究,也不必問為什么是這樣,后續(xù)會逐步給大家講解。

#include <stdio.h>
int main(){
    puts("劉老師,您好!");
    return 0;
}

這些具有 特定含義的詞匯、語句,按照特定的格式組織在一起,就構(gòu)成了 源代碼(Source Code),也稱 源碼或代碼(Code)。

那么,C語言肯定規(guī)定了源代碼中每個詞匯、語句的含義,也規(guī)定了它們 該如何組織在一起,這就是 語法(Syntax)。 它與我們學(xué)習(xí)英語時所說的 語法 類似,都規(guī)定了如何將特定的詞匯和句子組織成能聽懂的語言。編寫源代碼的過程就叫做 編程(Program)。 從事編程工作的人叫 程序員(Programmer)。 程序員也很幽默,喜歡自嘲,經(jīng)常說自己的工作辛苦,地位低,像農(nóng)民一樣,所以稱自己是 碼農(nóng),就是寫代碼的農(nóng)民。也有人自嘲稱是 程序猿/程序媛。
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

三、為什么要學(xué)習(xí)C語言

C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
在第二小節(jié)中我們介紹了 程序語言發(fā)展歷史,那么這么多的高級語言,為什么我們要先學(xué)習(xí)C語言呢,理由如下:

C語言具有可移植性好、跨平臺的特點,用C編寫的代碼可以在不同的操作系統(tǒng)和硬件平臺上編譯和運行。C語言的原始設(shè)計目的,是將 Unix 系統(tǒng)移植到其他計算機架構(gòu),這使得它從一開始就非常注重可移植性。

C語言在許多領(lǐng)域應(yīng)用廣泛。掌握C語言可以讓你有更多就業(yè)機會。

操作系統(tǒng):C 廣泛用于開發(fā)操作系統(tǒng),如 Unix、Linux 和Windows。
嵌入式系統(tǒng):C 是一種用于開發(fā)嵌入式系統(tǒng)(如微控制器、微處理器和其他電子設(shè)備)的流行語言。
系統(tǒng)軟件:C用于開發(fā)設(shè)備驅(qū)動程序、編譯器和匯編器等系統(tǒng)軟件。
網(wǎng)絡(luò):C 語言廣泛用于開發(fā)網(wǎng)絡(luò)應(yīng)用程序,例如 Web 服務(wù)器、網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序。
數(shù)據(jù)庫系統(tǒng):C 用于開發(fā)數(shù)據(jù)庫系統(tǒng),例如 Oracle、MySQL 和PostgreSQL。
游戲:由于 C 能夠處理低級硬件交互,因此經(jīng)常用于開發(fā)計算機游戲。
人工智能:C 用于開發(fā)人工智能和機器學(xué)習(xí)應(yīng)用程序,例如神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)算法。
科學(xué)應(yīng)用:C 用于開發(fā)科學(xué)應(yīng)用程序,例如仿真軟件和數(shù)值分析工具。
金融應(yīng)用:C用于開發(fā)股票市場分析和交易系統(tǒng)等金融應(yīng)用。

C語言能夠直接對硬件進(jìn)行操作、管理內(nèi)存、跟操作系統(tǒng)對話,這使得它是一種非常接近底層的語言,非常適合寫需要跟硬件交互、有極高性能要求的程序。

學(xué)習(xí)C語言有助于快速上手其他編程語言,比如C++(原先是C語言的一個擴展,在C語言的基礎(chǔ)上嫁接了面向?qū)ο缶幊蹋?、C#、 Java、PHP、Javascript、Perl、Python 等,這些語言都繼承或深受C語言的影響和啟發(fā)。說C語言是現(xiàn)代編程語言的開山鼻祖毫不夸張,它改變了編程世界。

在世界編程語言排行榜中,C語言、Java 和 C++ 長期霸占著前三名,加上近幾年爆火的 Python,四門語言的市場占用率之和接近 50%,擁有絕對優(yōu)勢,如下表所示:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
網(wǎng)友一言話C: https://www.nowcoder.com/stack/209
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

C語言長盛不衰。至今,依然是最廣泛使用、最流行的編程語言之一。包括很多大學(xué)將C語言作為計算機教學(xué)的入門語言,擁有龐大而活躍的用戶社區(qū),這意味著有許多資源和庫可供開發(fā)人員使用。

C語言是菜鳥和大神的分水嶺。

對于大部分程序員,C語言是學(xué)習(xí)編程的第一門語言,很少有不了解C的程序員。C語言除了能讓你了解編程的相關(guān)概念,帶你走進(jìn)編程的大門,還能讓你明白程序的運行原理,比如,計算機的各個部件是如何交互的,程序在內(nèi)存中是一種怎樣的狀態(tài),操作系統(tǒng)和用戶程序之間有著怎樣的 愛恨情仇 這些底層知識決定了你的發(fā)展高度,也決定了你的職業(yè)生涯。如果你希望成為出類拔萃的人才,而不僅僅是碼農(nóng),這么這些知識就是不可逾越的。也只有學(xué)習(xí)C語言,才能更好地了解它們。有了足夠的基礎(chǔ),以后學(xué)習(xí)其他語言,會觸類旁通,很快上手,7 天了解一門新語言不是神話。
所有的程序都在拼盡全力節(jié)省內(nèi)存,都在不遺余力提高內(nèi)存使用效率,計算機的整個發(fā)展過程都在圍繞內(nèi)存打轉(zhuǎn),不斷地優(yōu)化內(nèi)存布局,以保證可以同時運行多個程序。不了解內(nèi)存,就學(xué)不會進(jìn)程和線程,就沒有資格玩中大型項目,沒有資格開發(fā)底層組件,沒有資格架構(gòu)一個系統(tǒng),命中注定你就是一個菜鳥,成不了什么氣候。
從C語言到內(nèi)存,從內(nèi)存到進(jìn)程和線程,環(huán)環(huán)相扣:不學(xué)C語言就吃不透內(nèi)存,不學(xué)內(nèi)存就吃不透進(jìn)程和線程?!竷?nèi)存 + 進(jìn)程 + 線程」這幾個最基本的計算機概念是菜鳥和大神的分水嶺,也只有學(xué)習(xí)C語言才能透徹地理解它們。Java、C#、PHP、Python、JavaScript 程序員工作幾年后會遇到瓶頸,有很多人會回來學(xué)習(xí)C語言,重拾底層概念,讓自己再次突破。

簡單易學(xué)。和 Java、C++、Python、C#、JavaScript 等高級編程語言相比,C語言涉及到的編程概念少,附帶的標(biāo)準(zhǔn)庫小,所以整體比較簡潔,容易學(xué)習(xí),非常適合初學(xué)者入門。
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

四、學(xué)習(xí)C語言的常見困惑

C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
本小節(jié)主要是解答初學(xué)者的疑惑,沒有信心的讀者看了會吃一顆定心丸,浮躁的讀者看了會被潑一盆冷水。

4.1 學(xué)編程難嗎?多久能入門?

編程是一門技術(shù),我也不知道它難不難,我只知道,只要你想學(xué),肯定能學(xué)會。每個人的邏輯思維能力不同,興趣點不同,總有一部分人覺得容易,一部分人覺得吃力。在我看來,技術(shù)就是一層窗戶紙,是有道理可以遵循的,最起碼要比搞抽象的藝術(shù)容易很多。但是,隔行如隔山,學(xué)好編程也不是一朝一夕的事,想 吃快餐 的讀者可以退出編程界了,浮躁的人搞不了技術(shù)。

在技術(shù)領(lǐng)域,編程的入門門檻很低,互聯(lián)網(wǎng)的資料很多,只要你有一臺計算機,一根網(wǎng)線,具備初中學(xué)歷,就可以學(xué)習(xí),投資在 7000RMB 左右。不管是技術(shù)還是非技術(shù),要想有所造詣,都必須潛心鉆研,沒有幾年功夫不會鶴立雞群。所以請先問問你自己,你想學(xué)編程嗎,你喜歡嗎,如果你覺得自己對編程很感興趣,想了解軟件或網(wǎng)站是怎么做的,那么就不要再問這個問題了,盡管去學(xué)就好了。

4.2 多久能學(xué)會編程?

這是一個沒有答案的問題。每個人投入的時間、學(xué)習(xí)效率和基礎(chǔ)都不一樣。如果你每天都拿出大把的時間來學(xué)習(xí),那么兩三個月就可以學(xué)會C/C++,不到半年時間就可以編寫出一些軟件。但是有一點可以肯定,幾個月從小白成長為大神是絕對不可能的。要想出類拔萃,沒有幾年功夫是不行的。學(xué)習(xí)編程不是看幾本書就能搞定的,需要你不斷的練習(xí),編寫代碼,積累零散的知識點,代碼量跟你的編程水平直接相關(guān),沒有幾萬行代碼,沒有拿得出手的作品,怎能稱得上 大神。 每個人程序員都是這樣過來的,開始都是一頭霧水,連輸出九九乘法表都很吃力,只有通過不斷練習(xí)才能熟悉,這是一個強化思維方式的過程。知識點可以在短時間內(nèi)了解,但是思維方式和編程經(jīng)驗需要不斷實踐才能強化,這就是為什么很多初學(xué)者已經(jīng)了解了C語言的基本概念,但是仍然不會編寫代碼的原因。

程序員被戲稱為 碼農(nóng) 意思是寫代碼的農(nóng)民,要想成為一個合格的農(nóng)民,必須要腳踏實地辛苦耕耘。也不要壓力太大,一切編程語言都是紙老虎,一層窗戶紙,只要開竅了,就容易了。一個人要想在某一方面有所成就,就必須有 10000小時 浸泡 在這件事情上,最終一定會有所收獲。
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
很多領(lǐng)域都是「一年打基礎(chǔ),兩年見成效,三年有突破」,但是很多人在不到一年的時間里就放棄了,總覺得這個行業(yè)太難,不太適合自己。輕言放棄是很可怕的,你要知道,第一次放棄只是浪費了時間,第二次放棄會打擊你的信心,第三次放棄會摧毀你的意志,你就再也沒有嘗試的勇氣了,蹉跎人生 就是這么來的。你也不要羨慕那些富二代官二代,你以為人生就是一次百米短跑,你贏了就是贏了,其實人生是一場接力賽,你的父輩祖輩都得贏,那些富二代官二代從好幾十年以前就開始積累了。所以,沉下一顆心來,從現(xiàn)在開始積累吧,有執(zhí)念的人最可怕。

4.3 英語基礎(chǔ)不好可以學(xué)會編程嗎?

首先,學(xué)習(xí)編程需要你有英語基礎(chǔ);但是,要求并不高,初中水平完全可以勝任。編程語言起源于美國,是由英文構(gòu)成的,其中包括幾十個英文的關(guān)鍵字以及幾百個英文的函數(shù),除非需要對文本進(jìn)行處理,否則一般不會出現(xiàn)中文。但是,它們都是孤立的單詞,不構(gòu)成任何語句,不涉及任何語法。幾十個關(guān)鍵字不多,用得多了自然會記住,相信大家也不會擔(dān)心。下面是C語言中的 32 個關(guān)鍵字:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
幾百個函數(shù)就沒人能記住了(包括我),也不用記住,查詢文檔即可,每種編程語言都會提供配套的文檔。常用到的函數(shù)也就幾十個,記住它們就足夠應(yīng)付日常開發(fā)了,生僻的函數(shù)查詢文檔即可。此外,我推薦大家安裝有道詞典,它的劃詞取詞功能非常棒,選中一個單詞或者句子能夠及時翻譯,這對大家記憶和理解代碼非常有幫助。

對于英文資料

如果你希望達(dá)到很高的造詣,希望被人稱為 大神, 那么肯定要閱讀英文的技術(shù)資料(不是所有資料都被翻譯成了中文),初中水平就有點吃力了。不過,長期閱讀英文會提高你的英文水平,只要你堅持一段時間,即使只有初中水平,我相信借助有道詞典也會提高很快。推薦一本書:程序員的英語
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

4.4 數(shù)學(xué)基礎(chǔ)不好可以學(xué)編程嗎?

談到數(shù)學(xué),那真是多慮了,它根本不構(gòu)成障礙,會加減乘除就能學(xué)編程。編程語言確實涉及到很多算法,有一些還需要高等數(shù)學(xué)知識,但是,這些算法都已經(jīng)被封裝好了,你直接拿來用就可以,根本不用你重復(fù)造輪子。另外,這些算法都是在很深的底層為我們默默的工作,初級程序員根本不會涉及到算法,即使是別人已經(jīng)封裝好的算法,一般也沒有機會使用,所以,你就別瞎操心了。

五、C語言和C++到底有什么關(guān)系?

C++ 讀作 C加加,是 C Plus Plus 的簡稱。顧名思義,C++是在C的基礎(chǔ)上增加新特性,玩出了新花樣,所以叫 C Plus Plus,就像 iPhone 6S 和 iPhone 6、Win10 和 Win7 的關(guān)系。

C語言是1972年由美國貝爾實驗室研制成功的,在當(dāng)時算是高級語言,它的很多新特性都讓匯編程序員羨慕不已,就像今天的Go語言,剛出生就受到追捧。C語言也是 時髦 的語言,后來的很多軟件都用C語言開發(fā),包括 Windows、Linux 等。但是隨著計算機性能的飛速提高,硬件配置與幾十年前已有天壤之別,軟件規(guī)模也不斷增大,很多軟件的體積都超過 2G,例如 PhotoShop、Visual Studio 等,用C語言開發(fā)這些軟件就顯得非常吃力了,這時候C++就應(yīng)運而生了。C++ 主要在C語言的基礎(chǔ)上增加了面向?qū)ο蠛头盒偷臋C制,提高了開發(fā)效率,以適用于大中型軟件的編寫。

C++和C的血緣關(guān)系: 早期并沒有 C++ 這個名字,而是叫做 帶類的C。帶類的C 是作為C語言的一個擴展和補充出現(xiàn)的,目的是提高開發(fā)效率,如果你有 Java Web 開發(fā)經(jīng)驗,那么你可以將它們的關(guān)系與 Java 和 JSP 的關(guān)系類比。這個時期的C++非常粗糙,僅支持簡單的面向?qū)ο缶幊蹋矝]有自己的編譯器,而是通過一個預(yù)處理程序(名字叫 cfront),先將C++代碼 翻譯 為C語言代碼,再通過C語言編譯器合成最終的程序。隨著C++的流行,它的語法也越來越強大,已經(jīng)能夠很完善的支持面向?qū)ο缶幊毯头盒途幊?。但是一直也沒有誕生出新的C++編譯器,而是對原來C編譯器不斷擴展,讓它支持C++的新特性,所以我們通常稱為C/C++編譯器,因為它同時支持C和C++,例如 Windows 下的微軟編譯器(cl.exe),Linux 下的 GCC 編譯器。也就是說,你寫的C、C++代碼都會通過一個編譯器來編譯,很難說C++是一門獨立的語言,還是對C的擴展。
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
學(xué)院派 的角度來說,C++支持面向過程編程、面向?qū)ο缶幊毯头盒途幊?,而C語言僅支持面向過程編程。就面向過程編程而言,C++和C幾乎是一樣的,所以學(xué)習(xí)了C語言,也就學(xué)習(xí)了C++的一半,不需要從頭再來。后續(xù)我的教程也是這樣安排的:

  1. 先講解C語言,不希望學(xué)習(xí)C++的讀者可以就此止步。
  2. 再講解C++,主要包括C++和C的一些差別,以及面向?qū)ο缶幊毯头盒途幊獭?/li>

沒有任何編程基礎(chǔ)的讀者,建議先從C語言學(xué)起,不要貪多嚼不爛。等你熟悉了C語言,能編寫出上百行的代碼,就對編程有些概念了,這個時候再去了解C++究竟在C語言基礎(chǔ)上增加了什么,你就站在了一定的高度。有編程基礎(chǔ)的讀者,相信你自己能做出正確的判斷。

六、計算機組成原理之?dāng)?shù)據(jù)的表示和運算

參考文章:https://blog.csdn.net/xw1680/article/details/132417469

七、程序的運行

如果你的電腦上安裝了微信,你希望和好友聊天,會雙擊微信圖標(biāo),打開微信軟件,輸入賬號和密碼,然后登錄就可以了。那么,微信是怎么運行起來的呢?首先,有一點你要明確,你安裝的微信軟件是保存在硬盤中的。雙擊微信圖標(biāo),操作系統(tǒng)就會知道你要運行這個軟件,它會在硬盤中找到你安裝的微信軟件,將數(shù)據(jù)(安裝的軟件本質(zhì)上就是很多數(shù)據(jù)的集合)復(fù)制到內(nèi)存。對!就是復(fù)制到內(nèi)存!微信不是在硬盤中運行的,而是在內(nèi)存中運行的。為什么呢?因為內(nèi)存的讀寫速度比硬盤快很多。

對于讀寫速度,內(nèi)存 > 固態(tài)硬盤 > 機械硬盤。機械硬盤是靠電機帶動盤片轉(zhuǎn)動來讀寫數(shù)據(jù)的,而內(nèi)存條通過電路來讀寫數(shù)據(jù),電機的轉(zhuǎn)速肯定沒有電的傳輸速度 (幾乎是光速) 快。雖然固態(tài)硬盤也是通過電路來讀寫數(shù)據(jù),但是因為與內(nèi)存的控制方式不一樣,速度也不及內(nèi)存。

所以,不管是運行微信還是編輯 Word 文檔,都是先將硬盤上的數(shù)據(jù)復(fù)制到內(nèi)存,才能讓CPU來處理,這個過程就叫作載入內(nèi)存(Load into Memory)。完成這個過程需要一個特殊的程序(軟件),這個程序就叫做加載器(Loader)。CPU直接與內(nèi)存打交道,它會讀取內(nèi)存中的數(shù)據(jù)進(jìn)行處理,并將結(jié)果保存到內(nèi)存。如果需要保存到硬盤,才會將內(nèi)存中的數(shù)據(jù)復(fù)制到硬盤。

例如,打開 Word 文檔,輸入一些文字,雖然我們看到的不一樣了,但是硬盤中的文檔沒有改變,新增的文字暫時保存到了內(nèi)存,Ctrl+S 才會保存到硬盤。因為內(nèi)存斷電后會丟失數(shù)據(jù),所以如果你編輯完 Word 文檔忘記保存就關(guān)機了,那么你將永遠(yuǎn)無法找回這些內(nèi)容。

虛擬內(nèi)存: 如果我們運行的程序較多,占用的空間就會超過內(nèi)存(內(nèi)存條)容量。例如計算機的內(nèi)存容量為2G,卻運行著10個程序,這10個程序共占用3G的空間,也就意味著需要從硬盤復(fù)制 3G 的數(shù)據(jù)到內(nèi)存,這顯然是不可能的。

操作系統(tǒng)(Operating System,簡稱 OS) 為我們解決了這個問題:當(dāng)程序運行需要的空間大于內(nèi)存容量時,會將內(nèi)存中暫時不用的數(shù)據(jù)再寫回硬盤;需要這些數(shù)據(jù)時再從硬盤中讀取,并將另外一部分不用的數(shù)據(jù)寫入硬盤。這樣,硬盤中就會有一部分空間用來存放內(nèi)存中暫時不用的數(shù)據(jù)。這一部分空間就叫做虛擬內(nèi)存(Virtual Memory)。3G - 2G = 1G,上面的情況需要在硬盤上分配 1G 的虛擬內(nèi)存。

硬盤的讀寫速度比內(nèi)存慢很多,反復(fù)交換數(shù)據(jù)會消耗很多時間,所以如果你的內(nèi)存太小,會嚴(yán)重影響計算機的運行速度,甚至?xí)霈F(xiàn) 卡死 現(xiàn)象,即使CPU強勁,也不會有大的改觀。如果經(jīng)濟條件允許,建議將內(nèi)存升級為 32G,在 win7、win8、win10 下運行軟件就會比較流暢了??偨Y(jié):CPU直接從內(nèi)存中讀取數(shù)據(jù),處理完成后將結(jié)果再寫入內(nèi)存。CPU、內(nèi)存、硬盤和主板的關(guān)系如下圖所示:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

八、字符編碼

8.1 ASCII編碼

計算機是以二進(jìn)制的形式來存儲數(shù)據(jù)的,它只認(rèn)識 0 和 1 兩個數(shù)字,我們在屏幕上看到的文字,在存儲之前都被轉(zhuǎn)換成了二進(jìn)制(0和1序列),在顯示時也要根據(jù)二進(jìn)制找到對應(yīng)的字符。

可想而知,特定的文字必然對應(yīng)著固定的二進(jìn)制,否則在轉(zhuǎn)換時將發(fā)生混亂。那么,怎樣將文字與二進(jìn)制對應(yīng)起來呢?這就需要有一套規(guī)范,計算機公司和軟件開發(fā)者都必須遵守,這樣的一套規(guī)范就稱為 字符集(Character Set) 或者 字符編碼(Character Encoding)。

嚴(yán)格來說,字符集和字符編碼不是一個概念,字符集定義了文字和二進(jìn)制的對應(yīng)關(guān)系,為字符分配了唯一的編號,而字符編碼規(guī)定了如何將文字的編號存儲到計算機中。我們暫時先不討論這些細(xì)節(jié),姑且認(rèn)為它們是一個概念,本節(jié)中也混用了這兩個概念,未做區(qū)分。

字符集為每個字符分配一個唯一的編號,類似于學(xué)生的學(xué)號,通過編號就能夠找到對應(yīng)的字符??梢詫⒆址斫獬梢粋€很大的表格,它列出了所有字符和二進(jìn)制的對應(yīng)關(guān)系,計算機顯示文字或者存儲文字,就是一個查表的過程。在計算機逐步發(fā)展的過程中,先后出現(xiàn)了幾十種甚至上百種字符集,有些還在使用,有些已經(jīng)淹沒在了歷史的長河中,本小節(jié)要講解的是一種專門針對英文的字符集—— ASCII 編碼。

1、拉丁字母(開胃小菜)。 在正式介紹 ASCII 編碼之前,我們先來說說什么是拉丁字母。估計也有不少讀者和我一樣,對于拉丁字母、英文字母和漢語拼音中的字母的關(guān)系不是很清楚。拉丁字母也叫羅馬字母,它源自希臘字母,是當(dāng)今世界上使用最廣的字母系統(tǒng)?;镜睦∽帜妇褪俏覀兘?jīng)常見到的 ABCD 等26個英文字母。拉丁字母、阿拉伯字母、斯拉夫字母(西里爾字母)被稱為世界三大字母體系。拉丁字母原先是歐洲人使用的,后來由于歐洲殖民主義,導(dǎo)致這套字母體系在全球范圍內(nèi)開始流行,美洲、非洲、澳洲、亞洲都沒有逃過西方文化的影響。中國也是,我們現(xiàn)在使用的拼音其實就是拉丁字母,是不折不扣的舶來品。

后來,很多國家對 26 個基本的拉丁字母進(jìn)行了擴展,以適應(yīng)本地的語言文化。最常見的擴展方式就是加上變音符號,例如漢語拼音中的 ü,就是在u的基礎(chǔ)上加上兩個小點演化而來;再如,áà 就是在a的上面標(biāo)上音調(diào)。總起來說: 基本拉丁字母就是 26 個英文字母;擴展拉丁字母就是在基本的 26 個英文字母的基礎(chǔ)上添加變音符號、橫線、斜線等演化而來,每個國家都不一樣。

2、ASCII 編碼。 計算機是美國人發(fā)明的,他們首先要考慮的問題是,如何將二進(jìn)制和英文字母(也就是拉丁文)對應(yīng)起來。當(dāng)時,各個廠家或者公司都有自己的做法,編碼規(guī)則并不統(tǒng)一,這給不同計算機之間的數(shù)據(jù)交換帶來不小的麻煩。但是相對來說,能夠得到普遍認(rèn)可的有 IBM 發(fā)明的 EBCDIC 和此處要談的 ASCII。我們先說 ASCII。ASCII 是 American Standard Code for Information Interchange 的縮寫,翻譯過來是 美國信息交換標(biāo)準(zhǔn)代碼。看這個名字就知道,這套編碼是美國人給自己設(shè)計的,他們并沒有考慮歐洲那些擴展的拉丁字母,也沒有考慮韓語和日語,我大中華幾萬個漢字更是不可能被重視。但這也無可厚非,美國人自己發(fā)明的計算機,當(dāng)然要先解決自己的問題

ASCII 的標(biāo)準(zhǔn)版本于 1967 年第一次發(fā)布,最后一次更新則是在 1986 年,迄今為止共收錄了 128 個字符,包含了基本的 拉丁字母(英文字母)、阿拉伯?dāng)?shù)字(也就是1234567890)、標(biāo)點符號(,.!等)、特殊符號(@#$%^&等) 以及一些具有控制功能的字符(往往不會顯示出來)。

在 ASCII 編碼中,大寫字母、小寫字母和阿拉伯?dāng)?shù)字都是連續(xù)分布的(見 https://baike.baidu.com/item/ASCII?fromModule=lemma_search-box),這給程序設(shè)計帶來了很大的方便。例如要判斷一個字符是否是大寫字母,就可以判斷該字符的 ASCII 編碼值是否在 65~90 的范圍內(nèi)。

EBCDIC 編碼正好相反,它的英文字母不是連續(xù)排列的,中間出現(xiàn)了多次斷續(xù),給編程帶來了一些困難。現(xiàn)在連 IBM 自己也不使用 EBCDIC 了,轉(zhuǎn)而使用更加優(yōu)秀的 ASCII。ASCII 編碼已經(jīng)成了計算機的通用標(biāo)準(zhǔn),沒有人再使用 EBCDIC 編碼了,它已經(jīng)消失在歷史的長河中了。

標(biāo)準(zhǔn) ASCII 編碼共收錄了 128 個字符,其中包含了 33 個控制字符(具有某些特殊功能但是無法顯示的字符) 和 95 個可顯示字符,查看:https://baike.baidu.com/item/ASCII?fromModule=lemma_search-box 該表列出的是標(biāo)準(zhǔn)的 ASCII 編碼,它共收錄了 128 個字符,用一個字節(jié)中較低的 7 個比特位(Bit)足以表示(27 = 128),所以還會空閑下一個比特位,它就被浪費了。如果還想了解每個控制字符的含義,請轉(zhuǎn)到:http://c.biancheng.net/c/ascii/

8.2 GB2312編碼和GBK編碼

計算機是一種改變世界的發(fā)明,很快就從美國傳到了全球各地,得到了所有國家的認(rèn)可,成為了一種不可替代的工具。計算機在廣泛流行的過程中遇到的一個棘手問題就是字符編碼,計算機是美國人發(fā)明的,它使用的是 ASCII 編碼,只能顯示英文字符,對漢語、韓語、日語、法語、德語等其它國家的字符無能為力。

為了讓本國公民也能使用上計算機,各個國家(地區(qū)) 也開始效仿 ASCII,開發(fā)了自己的字符編碼。這些字符編碼和 ASCII 一樣,只考慮本國的語言文化,不兼容其它國家的文字。這樣做的后果就是,一臺計算機上必須安裝多套字符編碼,否則就不能正確地跨國傳遞數(shù)據(jù),例如在中國編寫的文本文件,拿到日本的電腦上就無法打開,或者打開后是一堆亂碼。下表列出了常見的字符編碼:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
由于 ASCII 先入為主,已經(jīng)使用了十來年了,現(xiàn)有的很多軟件和文檔都是基于 ASCII 的,所以后來的這些字符編碼都是在 ASCII 基礎(chǔ)上進(jìn)行的擴展,它們都兼容 ASCII,以支持既有的軟件和文檔。兼容 ASCII 的含義是,原來 ASCII 中已經(jīng)包含的字符,在國家編碼(地區(qū)編碼)中的位置不變(也就是編碼值不變),只是在這些字符的后面增添了新的字符。

標(biāo)準(zhǔn) ASCII 編碼共包含了 128 個字符,用一個字節(jié)就足以存儲(實際上是用一個字節(jié)中較低的 7 位來存儲),而日文、中文、韓文等包含的字符非常多,有成千上萬個,一個字節(jié)肯定是不夠的(一個字節(jié)最多存儲 28 = 256 個字符),所以要進(jìn)行擴展,用兩個、三個甚至四個字節(jié)來表示。在制定字符編碼時還要考慮內(nèi)存利用率的問題。我們經(jīng)常使用的字符,其編碼值一般都比較小,例如字母和數(shù)字都是 ASCII 編碼,其編碼值不會超過 127,用一個字節(jié)存儲足以,如果硬要用多個字節(jié)存儲,就會浪費很多內(nèi)存空間。為了達(dá)到 既能存儲本國字符,又能節(jié)省內(nèi)存 的目的,Shift-Jis、Big5、GB2312 等都采用變長的編碼方式:

對于原來的 ASCII 編碼部分,用一個字節(jié)存儲足以
對于本國的常用字符(例如漢字、標(biāo)點符號等),一般用兩個字節(jié)存儲
對于偏遠(yuǎn)地區(qū),或者極少使用的字符(例如藏文、蒙古文等),才使用三個甚至四個字節(jié)存儲

總起來說,越常用的字符占用的內(nèi)存越少,越罕見的字符占用的內(nèi)存越多。

中文編碼方案: GB2312 --> GBK --> GB18030 是中文編碼的三套方案,出現(xiàn)的時間從早到晚,收錄的字符數(shù)目依次增加,并且向下兼容。GB2312 和 GBK 收錄的字符數(shù)目較少,用 1~2個字節(jié)存儲;GB18030 收錄的字符最多,用 1、2、4 個字節(jié)存儲。

從整體上講,GB2312 和 GBK 的編碼方式一致,具體為:對于 ASCII 字符,使用一個字節(jié)存儲,并且該字節(jié)的最高位是 0,這和 ASCII 編碼是一致的,所以說 GB2312 完全兼容 ASCII。對于中國的字符,使用兩個字節(jié)存儲,并且規(guī)定每個字節(jié)的最高位都是 1。例如對于字母A,它在內(nèi)存中存儲為 01000001;對于漢字中,它在內(nèi)存中存儲為 11010110 11010000。由于單字節(jié)和雙字節(jié)的最高位不一樣,所以字符處理軟件很容易區(qū)分一個字符到底用了幾個字節(jié)。

GB18030 為了容納更多的字符,并且要區(qū)分兩個字節(jié)和四個字節(jié),所以修改了編碼方案,具體為:對于 ASCII 字符,使用一個字節(jié)存儲,并且該字節(jié)的最高位是 0,這和 ASCII、GB2312、GBK 編碼是一致的。對于常用的中文字符,使用兩個字節(jié)存儲,并且規(guī)定第一個字節(jié)的最高位是 1,第二個字節(jié)的高位最多只能有一個連續(xù)的 0(第二個字節(jié)的最高位可以是 1 也可以是 0,但是當(dāng)它是 0 時,次高位就不能是 0 了)。注意對比 GB2312 和 GBK,它們要求兩個字節(jié)的最高位為都必須為 1。對于罕見的字符,使用四個字節(jié)存儲,并且規(guī)定第一個和第三個字節(jié)的最高位是 1,第二個和第四個字節(jié)的高位必須有兩個連續(xù)的 0。例如對于字母A,它在內(nèi)存中存儲為 01000001;對于漢字中,它在內(nèi)存中存儲為 11010110 11010000;對于藏文???,它在內(nèi)存中的存儲為 10000001 00110010 11101111 00110000。

字符處理軟件在處理文本時,從左往右依次掃描每個字節(jié):

如果遇到的字節(jié)的最高位是 0,那么就會斷定該字符只占用了一個字節(jié)
如果遇到的字節(jié)的最高位是 1,那么該字符可能占用了兩個字節(jié),也可能占用了四個字節(jié),不能妄下斷論,所以還要繼續(xù)往后掃描
如果第二個字節(jié)的高位有兩個連續(xù)的 0,那么就會斷定該字符占用了四個字節(jié)
如果第二個字節(jié)的高位沒有連續(xù)的 0,那么就會斷定該字符占用了兩個字節(jié)

可見,當(dāng)字符占用兩個或者四個字節(jié)時,GB18030 編碼要檢測兩次,處理效率比 GB2312 和 GBK 都低。GBK 編碼最牛掰: GBK 于 1995 年發(fā)布,這一年也是互聯(lián)網(wǎng)爆發(fā)的元年,國人使用電腦越來越多,也許是 GBK 這頭豬正好站在風(fēng)口上,它就飛起來了,后來的中文版 Windows 都將 GBK 作為默認(rèn)的中文編碼方案。注意,這里我說 GBK 是默認(rèn)的中文編碼方案,并沒有說 Windows 默認(rèn)支持 GBK。Windows 在內(nèi)核層面使用的是 Unicode 字符集(嚴(yán)格來說是 UTF-16 編碼),但是它也給用戶留出了選擇的余地,如果用戶不希望使用 Unicode,而是希望使用中文編碼方案,那么這個時候 Windows 默認(rèn)使用 GBK(當(dāng)然,你可以選擇使用 GB2312 或者 GB18030,不過一般沒有這個必要)。實際上,中文版 Windows 下的很多程序默認(rèn)使用的就是 GBK 編碼,例如用記事本程序創(chuàng)建一個 txt 文檔、在 cmd 或者控制臺程序(最常見的C語言程序)中顯示漢字、用 Visual Studio 創(chuàng)建的源文件等,使用的都是 GBK 編碼??梢哉f,GBK 編碼在中文版的 Windows 中大行其道。

8.3 Unicode字符集

ASCII、GB2312、GBK、Shift_Jis、ISO/IEC 8859 等地區(qū)編碼都是各個國家為了自己的語言文化開發(fā)的,不具有通用性,在一種編碼下開發(fā)的軟件或者編寫的文檔,拿到另一種編碼下就會失效,必須提前使用程序轉(zhuǎn)碼,非常麻煩。人們迫切希望有一種編碼能夠統(tǒng)一世界各地的字符,計算機只要安裝了這一種文字編碼,就能支持使用世界上所有的文字,再也不會出現(xiàn)亂碼,再也不需要轉(zhuǎn)碼了,這對計算機的數(shù)據(jù)傳遞來說是多么的方便呀!就在這種呼吁下,Unicode 誕生了。Unicode 也稱為統(tǒng)一碼、萬國碼;看名字就知道,Unicode 希望統(tǒng)一所有國家的字符編碼。Unicode 于 1994 年正式公布第一個版本,現(xiàn)在的規(guī)??梢匀菁{ 100 多萬個符號,是一個很大的集合。

有興趣的讀取可以轉(zhuǎn)到 https://unicode-table.com/cn/ 查看 Unicode 包含的所有字符,以及各個國家的字符是如何分布的。

Windows、Linux、Mac OS 等常見操作系統(tǒng)都已經(jīng)從底層(內(nèi)核層面) 開始支持 Unicode,大部分的網(wǎng)頁和軟件也使用 Unicode,Unicode 是大勢所趨。不過由于歷史原因,目前的計算機仍然安裝了 ASCII 編碼以及 GB2312、GBK、Big5、Shift-JIS 等地區(qū)編碼,以支持不使用 Unicode 的軟件或者文檔。內(nèi)核在處理字符時,一般會將地區(qū)編碼先轉(zhuǎn)換為 Unicode,再進(jìn)行下一步處理。本節(jié)我們多次說 Unicode 是一套字符集,而不是一套字符編碼,它們之間究竟有什么區(qū)別呢?

嚴(yán)格來說,字符集和字符編碼不是一個概念:

  1. 字符集定義了字符和二進(jìn)制的對應(yīng)關(guān)系,為每個字符分配了唯一的編號??梢詫⒆址斫獬梢粋€很大的表格,它列出了所有字符和二進(jìn)制的對應(yīng)關(guān)系,計算機顯示文字或者存儲文字,就是一個查表的過程。
  2. 而字符編碼規(guī)定了如何將字符的編號存儲到計算機中。如果使用了類似 GB2312 和 GBK 的變長存儲方案(不同的字符占用的字節(jié)數(shù)不一樣),那么為了區(qū)分一個字符到底使用了幾個字節(jié),就不能將字符的編號直接存儲到計算機中,字符編號在存儲之前必須要經(jīng)過轉(zhuǎn)換,在讀取時還要再逆向轉(zhuǎn)換一次,這套轉(zhuǎn)換方案就叫做字符編碼。

有的字符集在制定時就考慮到了編碼的問題,是和編碼結(jié)合在一起的,例如 ASCII、GB2312、GBK、BIG5 等,所以無論稱作字符集還是字符編碼都無所謂,也不好區(qū)分兩者的概念。而有的字符集只管制定字符的編號,至于怎么存儲,那是字符編碼的事情,Unicode 就是一個典型的例子,它只是定義了全球文字的唯一編號,我們還需要 UTF-8、UTF-16、UTF-32 這幾種編碼方案將 Unicode 存儲到計算機中。Unicode 可以使用的編碼方案有三種,分別是:

UTF-8: 一種變長的編碼方案,使用 1~6 個字節(jié)來存儲
UTF-32: 一種固定長度的編碼方案,不管字符編號大小,始終使用 4 個字節(jié)來存儲
UTF-16: 介于 UTF-8 和 UTF-32 之間,使用 2 個或者 4 個字節(jié)來存儲,長度既固定又可變

UTF 是 Unicode Transformation Format 的縮寫,意思是 Unicode轉(zhuǎn)換格式,后面的數(shù)字表明至少使用多少個比特位(Bit)來存儲字符。

1、UTF-8,UTF-8 的編碼規(guī)則很簡單:如果只有一個字節(jié),那么最高的比特位為 0,這樣可以兼容 ASCII;如果有多個字節(jié),那么第一個字節(jié)從最高位開始,連續(xù)有幾個比特位的值為 1,就使用幾個字節(jié)編碼,剩下的字節(jié)均以 10 開頭。具體的表現(xiàn)形式為:

0xxxxxxx: 單字節(jié)編碼形式,這和 ASCII 編碼完全一樣,因此 UTF-8 是兼容 ASCII 的
110xxxxx 10xxxxxx: 雙字節(jié)編碼形式(第一個字節(jié)有兩個連續(xù)的 1)
1110xxxx 10xxxxxx 10xxxxxx: 三字節(jié)編碼形式(第一個字節(jié)有三個連續(xù)的 1)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx: 四字節(jié)編碼形式(第一個字節(jié)有四個連續(xù)的 1)

xxx 就用來存儲 Unicode 中的字符編號。下面是一些字符的 UTF-8 編碼實例(綠色部分表示本來的 Unicode 編號):
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
對于常用的字符,它的 Unicode 編號范圍是 0 ~ FFFF,用 1~3 個字節(jié)足以存儲,只有及其罕見,或者只有少數(shù)地區(qū)使用的字符才需要 4~6 個字節(jié)存儲。

2、UTF-32, UTF-32 是固定長度的編碼,始終占用 4 個字節(jié),足以容納所有的 Unicode 字符,所以直接存儲 Unicode 編號即可,不需要任何編碼轉(zhuǎn)換。浪費了空間,提高了效率。

3、UTF-16, UFT-16 比較奇葩,它使用 2 個或者 4 個字節(jié)來存儲。對于 Unicode 編號范圍在 0 ~ FFFF 之間的字符,UTF-16 使用兩個字節(jié)存儲,并且直接存儲 Unicode 編號,不用進(jìn)行編碼轉(zhuǎn)換,這跟 UTF-32 非常類似。對于 Unicode 編號范圍在 10000~10FFFF 之間的字符,UTF-16 使用四個字節(jié)存儲,具體來說就是:將字符編號的所有比特位分成兩部分,較高的一些比特位用一個值介于 D800~DBFF 之間的雙字節(jié)存儲,較低的一些比特位(剩下的比特位) 用一個值介于 DC00~DFFF 之間的雙字節(jié)存儲。如果你不理解什么意思,請看下面的表格:
C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法
位于 D800~0xDFFF 之間的 Unicode 編碼是特別為四字節(jié)的 UTF-16 編碼預(yù)留的,所以不應(yīng)該在這個范圍內(nèi)指定任何字符。如果你真的去查看 Unicode 字符集,會發(fā)現(xiàn)這個區(qū)間內(nèi)確實沒有收錄任何字符。UTF-16 要求在制定 Unicode 字符集時必須考慮到編碼問題,所以真正的 Unicode 字符集也不是隨意編排字符的。

對比以上三種編碼方案,首先,只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因為它們沒有單字節(jié)編碼。UTF-8 使用盡量少的字節(jié)來存儲一個字符,不但能夠節(jié)省存儲空間,而且在網(wǎng)絡(luò)傳輸時也能節(jié)省流量,所以很多純文本類型的文件(例如各種編程語言的源文件、各種日志文件和配置文件等)以及絕大多數(shù)的網(wǎng)頁(例如百度、新浪、163等)都采用 UTF-8 編碼。

UTF-8 的缺點是效率低,不但在存儲和讀取時都要經(jīng)過轉(zhuǎn)換,而且在處理字符串時也非常麻煩。 例如,要在一個 UTF-8 編碼的字符串中找到第 10 個字符,就得從頭開始一個一個地檢索字符,這是一個很耗時的過程,因為 UTF-8 編碼的字符串中每個字符占用的字節(jié)數(shù)不一樣,如果不從頭遍歷每個字符,就不知道第 10 個字符位于第幾個字節(jié)處,就無法定位。不過,隨著算法的逐年精進(jìn),UTF-8 字符串的定位效率也越來越高了,往往不再是槽點了。

UTF-32 是 以空間換效率,正好彌補了 UTF-8 的缺點,UTF-32 的優(yōu)勢就是效率高:UTF-32 在存儲和讀取字符時不需要任何轉(zhuǎn)換,在處理字符串時也能最快速地定位字符。例如,在一個 UTF-32 編碼的字符串中查找第 10 個字符,很容易計算出它位于第 37 個字節(jié)處,直接獲取就行,不用再逐個遍歷字符了,沒有比這更快的定位字符的方法了。但是,UTF-32 的缺點也很明顯,就是太占用存儲空間了,在網(wǎng)絡(luò)傳輸時也會消耗很多流量。我們平常使用的字符編碼值一般都比較小,用一兩個字節(jié)存儲足以,用四個字節(jié)簡直是暴殄天物,甚至說是不能容忍的,所以 UTF-32 在應(yīng)用上不如 UTF-8 和 UTF-16 廣泛。

UTF-16 可以看做是 UTF-8 和 UTF-32 的折中方案,它平衡了存儲空間和處理效率的矛盾。對于常用的字符,用兩個字節(jié)存儲足以,這個時候 UTF-16 是不需要轉(zhuǎn)換的,直接存儲字符的編碼值即可。

Windows 內(nèi)核、.NET Framework、Cocoa、Java String 內(nèi)部采用的都是 UTF-16 編碼。UTF-16 是幕后的功臣,我們在編輯源代碼和文檔時都是站在前臺,所以一般感受不到,其實很多文本在后臺處理時都已經(jīng)轉(zhuǎn)換成了 UTF-16 編碼。不過,UNIX 家族的操作系統(tǒng)(Linux、Mac OS、iOS 等) 內(nèi)核都采用 UTF-8 編碼,我們就不去爭論誰好誰壞了。

寬字符和窄字符(多字節(jié)字符): 有的編碼方式采用 1~n 個字節(jié)存儲,是變長的,例如 UTF-8、GB2312、GBK 等;如果一個字符使用了這種編碼方式,我們就將它稱為多字節(jié)字符,或者窄字符。有的編碼方式是固定長度的,不管字符編號大小,始終采用 n 個字節(jié)存儲,例如 UTF-32、UTF-16 等;如果一個字符使用了這種編碼方式,我們就將它稱為寬字符。Unicode 字符集可以使用窄字符的方式存儲,也可以使用寬字符的方式存儲;GB2312、GBK、Shift-JIS 等國家編碼一般都使用窄字符的方式存儲;ASCII 只有一個字節(jié),無所謂窄字符和寬字符。

九、程序員的薪水和發(fā)展方向大全

如果你是一名初學(xué)者,對編程非常感興趣,想成為一名合格的程序員,那么本小節(jié)就是為你寫的。

從初學(xué)者成長為一名合格的程序員需要一段時間的磨練,每個人付出的時間和做事的效率不同,我不好評判你需要多長時間才能學(xué)有所成。站在求職的角度,能開發(fā)出實用的軟件、網(wǎng)站、APP等才叫學(xué)有所成。

9.1 程序員的發(fā)展方向

計算機涉及的知識非常廣泛,不可能在短時間內(nèi)全部學(xué)完,即使公司的 CTO 也不可能樣樣精通,初學(xué)者要選定一個方向,不要想著把客戶端軟件、網(wǎng)站、APP 都開發(fā)出來,這在短時間內(nèi)是不現(xiàn)實的。相信我,你不是神!

① Windows開發(fā): 主要是開發(fā)客戶端(PC機上的軟件),如QQ、迅雷、360、Chrome 等。能夠進(jìn)行 Windows 客戶端開發(fā)的編程語言有多種,包括 C/C++、C#、VB、Java、Delphi、易語言等。這意味著,Windows 開發(fā)有多種學(xué)習(xí)路線,大家任選其一。不過,公司一般使用 C/C++、C#、Java,自己編寫小工具也可以使用 VB、Delphi、易語言。

② 游戲開發(fā)(游戲客戶端開發(fā)): 需要你有C/C++基礎(chǔ),再學(xué)習(xí) Unreal(虛幻)、Frostbite(寒霜)、CryEngine(CE)等游戲引擎。如果你希望了解游戲引擎原理,讓自己更加優(yōu)秀,那么還需要學(xué)習(xí)圖形庫(例如 DirectX、OpenGL)和計算機圖形學(xué)。

③ Linux 開發(fā)/游戲后臺開發(fā): 需要在 C/C++ 的基礎(chǔ)上再學(xué)習(xí) Linux 操作系統(tǒng),主要包括 Linux 基本操作、Shell、文件系統(tǒng)、進(jìn)程線程、內(nèi)存、Socket 通信、內(nèi)核等,甚至還需要與算法、Qt 等相結(jié)合。另外,也可以使用Go語言進(jìn)行 Linux 開發(fā),Go語言在全球已經(jīng)有相當(dāng)多的應(yīng)用案例了。游戲的后臺服務(wù)器大部分也是基于 Linux的,也會用到以上技能。

④ 單片機/嵌入式: 單片機/嵌入式是軟件和硬件的結(jié)合,不僅要會寫代碼,還要了解硬件,所以入門門檻比較高,知識也比較龐雜,學(xué)習(xí)時間長。選擇該方向最好有數(shù)字電路、模擬電路和匯編的基礎(chǔ),非常適合電子信息工程專業(yè)的同學(xué)。這個方向的同學(xué),大部分去了中興、華為等以生產(chǎn)電子產(chǎn)品為主的公司,工資雖然沒有一般的程序員高,但也不錯。

⑤ 算法: NB的程序員都在搞這些,一般不注重編程語言,而是側(cè)重解決問題的方法和效率。工資比普通的程序員略高。

⑥ 網(wǎng)站開發(fā): 也稱 Web 開發(fā),分為前端和后臺。后臺主要負(fù)責(zé)服務(wù)器端的編程,除了需要學(xué)習(xí) Java、PHP、Python 等編程語言,還需要學(xué)習(xí) MySQL、MongoDB、Oracle 等數(shù)據(jù)庫。前端主要負(fù)責(zé)網(wǎng)頁界面的設(shè)計以及特效的實現(xiàn),需要學(xué)習(xí) HTML、CSS、JavaScript 等。JavaScript 本來只能用于 Web 前端,它可以實現(xiàn)一些特效,或者和服務(wù)器通信,后來有人把 JavaScript 移植到了服務(wù)器上,并起名 Node.js,這樣 JavaScript 也能進(jìn)行 Web 后臺開發(fā)了。也就是說,只要需要學(xué)習(xí) JavaScript 一門語言,就可以搞定網(wǎng)站的前端和后臺,成為全棧工程師。

⑦ 移動開發(fā): 包括 IOS 和 Android,你可以開發(fā) APP,也可以開發(fā)游戲,需要學(xué)習(xí) Java(針對Android)、Objective-C(針對IOS)、Swift(針對IOS) 等。

⑧ 測試(QA): 一款產(chǎn)品問世需要大量的測試才能投放市場,QA(Quality Assurance,譯為 品質(zhì)保證) 人員就是為程序員把關(guān)的,如果程序員的作品不符合產(chǎn)品需求或者 Bug 太多,QA 有權(quán)駁回,這時就會影響程序員的績效。QA 不但要能看懂代碼(大概理解什么意思),還要掌握一定的測試技巧,更重要的是心思縝密,有耐心有毅力,女生比例很高。

⑨ 大數(shù)據(jù): 需要掌握 Java、Python、R 或 Scala 編程語言,并學(xué)習(xí) Linux 操作系統(tǒng)、Linux 集群搭建、數(shù)據(jù)庫等,Hadoop、Spark、Hive 等大數(shù)據(jù)框架的學(xué)習(xí)是重點內(nèi)容。

⑩ 人工智能/機器學(xué)習(xí)/深度學(xué)習(xí): 除了需要掌握 Python、R 或 Java 編程語言,還需要學(xué)習(xí)數(shù)學(xué)(大都集中在微積分、線性代數(shù)、概率與統(tǒng)計幾個領(lǐng)域)和算法(例如邏輯回歸、深度神經(jīng)網(wǎng)絡(luò)、線性回歸、K均值、協(xié)同過濾等),這是重點內(nèi)容。

9.2 程序員的待遇

IT行業(yè)的待遇比很多行業(yè)要高,程序員尤為突出,剛剛畢業(yè)的大學(xué)生,進(jìn)入百度、騰訊、阿里巴巴等這些大企業(yè),年薪一般在15萬以上,經(jīng)驗豐富的可以拿到20多萬,30萬的就是神一樣的存在,有,但是極少。這是第一梯隊,一般重點大學(xué)的畢業(yè)生才能進(jìn)入,怎么也得是個一本吧。

拿到融資的創(chuàng)業(yè)公司、規(guī)模不大的公司、一些國企等給的待遇也不錯,年薪也可以超過10萬。很多小公司,老板一個人說了算,也沒有融資,待遇一般都不會高,一個月幾千塊錢。這樣的公司招人難,進(jìn)入的門檻低,對學(xué)歷的要求也可以忽略,能干點活就行。但是往往是這樣的公司最折磨人,你什么都需要做,漲薪?jīng)]有明文規(guī)定,老板經(jīng)常畫餅,還會威脅你說完不成任務(wù)就走人。每個城市的待遇也不一樣,北京、上海、廣州、杭州這些一線城市都有大公司,待遇最高;重慶、大連、西安這些二三線城市的待遇就一般了。

至此今天的學(xué)習(xí)就到此結(jié)束了,筆者在這里聲明,筆者寫文章只是為了學(xué)習(xí)交流,以及讓更多學(xué)習(xí)C語言基礎(chǔ)的讀者少走一些彎路,節(jié)省時間,并不用做其他用途,如有侵權(quán),聯(lián)系博主刪除即可。感謝您閱讀本篇博文,希望本文能成為您編程路上的領(lǐng)航者。祝您閱讀愉快!


C語言系統(tǒng)化精講(一):編程基礎(chǔ),C語言系統(tǒng)化精講,1024程序員節(jié),c語言,數(shù)據(jù)結(jié)構(gòu)與算法

????好書不厭讀百回,熟讀課思子自知。而我想要成為全場最靚的仔,就必須堅持通過學(xué)習(xí)來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力。
????如果我的博客對你有幫助、如果你喜歡我的博客內(nèi)容,請 點贊、評論收藏 一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
?編碼不易,大家的支持就是我堅持下去的動力。點贊后不要忘了 關(guān)注 我哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-758782.html

到了這里,關(guān)于C語言系統(tǒng)化精講(一):編程基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C語言系統(tǒng)化精講(六):C語言選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)

    C語言系統(tǒng)化精講(六):C語言選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)

    C語言中有三大結(jié)構(gòu),分別是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu): C語言順序結(jié)構(gòu)就是讓程序按照從頭到尾的順序依次執(zhí)行每一條C語言代碼,不重復(fù)執(zhí)行任何代碼,也不跳過任何代碼 C語言選擇結(jié)構(gòu)也稱分支結(jié)構(gòu),就是讓程序 拐彎 , 有選擇性的執(zhí)行代碼;換句話說,可以跳過沒

    2024年02月04日
    瀏覽(17)
  • 中文編程開發(fā)語言工具系統(tǒng)化教程零基礎(chǔ)入門篇和初級1專輯課程已經(jīng)上線,可以進(jìn)入輕松學(xué)編程

    中文編程開發(fā)語言工具系統(tǒng)化教程零基礎(chǔ)入門篇和初級1專輯課程已經(jīng)上線,可以進(jìn)入輕松學(xué)編程

    中文編程開發(fā)語言工具系統(tǒng)化教程零基礎(chǔ)入門篇和初級1專輯課程已經(jīng)上線,可以進(jìn)入輕松學(xué)編程 學(xué)習(xí)編程捷徑:(不論是正在學(xué)習(xí)編程的大學(xué)生,還是IT人士或者是編程愛好者,在學(xué)習(xí)編程的過程中用正確的學(xué)習(xí)方法 可以達(dá)到事半功倍的效果。對于初學(xué)者,可以通過下面的

    2024年02月08日
    瀏覽(109)
  • 中文編程開發(fā)語言工具系統(tǒng)化教程初級1上線

    中文編程開發(fā)語言工具系統(tǒng)化教程初級1上線

    中文編程系統(tǒng)化教程初級1 學(xué)習(xí)編程捷徑:(不論是正在學(xué)習(xí)編程的大學(xué)生,還是IT人士或者是編程愛好者,在學(xué)習(xí)編程的過程中用正確的學(xué)習(xí)方法 可以達(dá)到事半功倍的效果。對于初學(xué)者,可以通過下面的方法學(xué)習(xí)編程,通過對成百上千個實例練習(xí),則很快會成為編程 高手。

    2024年02月08日
    瀏覽(26)
  • 開發(fā)語言工具編程系統(tǒng)化教程入門和初級專輯課程上線

    開發(fā)語言工具編程系統(tǒng)化教程入門和初級專輯課程上線

    開發(fā)語言工具編程系統(tǒng)化教程入門和初級專輯課程上線 學(xué)習(xí)編程捷徑:(不論是正在學(xué)習(xí)編程的大學(xué)生,還是IT人士或者是編程愛好者,在學(xué)習(xí)編程的過程中用正確的學(xué)習(xí)方法 可以達(dá)到事半功倍的效果。對于初學(xué)者,可以通過下面的方法學(xué)習(xí)編程,通過對成百上千個實例練習(xí)

    2024年02月08日
    瀏覽(86)
  • 【Linux系統(tǒng)化學(xué)習(xí)】基礎(chǔ)開發(fā)工具——make和makefile

    【Linux系統(tǒng)化學(xué)習(xí)】基礎(chǔ)開發(fā)工具——make和makefile

    ========================================================================= 個人主頁點擊直達(dá): 小白不是程序媛? Linux學(xué)習(xí)專欄: Linux系統(tǒng)化學(xué)習(xí) ========================================================================= 目錄 前言: 初始make和makefile makefile的好處 make和makefile的區(qū)別 make和make的使用 依賴關(guān)系和依

    2024年02月05日
    瀏覽(38)
  • 為什么要學(xué)中文編程?它能有哪些益處?免費版編程工具怎么下載?系統(tǒng)化的編程教程課程怎么學(xué)習(xí)

    為什么要學(xué)中文編程?它能有哪些益處?免費版編程工具怎么下載?系統(tǒng)化的編程教程課程怎么學(xué)習(xí)

    圖下圖是編程工具界面,其構(gòu)件板構(gòu)件非常豐富。想學(xué)編程,可以點擊最下方卡片—— 軟件下載——免費自由版軟件下載及教程,了解詳細(xì)資訊。? 編程系統(tǒng)化教程視頻課程總目錄?鏈接,點擊下方鏈接進(jìn)入 https://jywxz.blog.csdn.net/article/details/134073098?spm=1001.2014.3001.5502 https://

    2024年02月05日
    瀏覽(21)
  • PPT系統(tǒng)化學(xué)習(xí) - 第1天

    PPT系統(tǒng)化學(xué)習(xí) - 第1天

    更改PPT的主題: 夜晚使用時建議使用深灰色。 文件 → 選項: 最大值為150,建議設(shè)置為150。 可以設(shè)置自動保存的時間間隔和保存的位置: 在PPT中插入圖片時,往往會自動壓縮圖片,使圖片所占空間變小??筛南路皆O(shè)置取消壓縮: 文件 → 選項: 在一臺電腦上制作PPT,設(shè)

    2024年02月07日
    瀏覽(27)
  • 第01篇:系統(tǒng)化學(xué)習(xí), 搞定Spring容器管理

    第01篇:系統(tǒng)化學(xué)習(xí), 搞定Spring容器管理

    公眾號 : 西魏陶淵明 CSDN : https://springlearn.blog.csdn.net 天下代碼一大抄, 抄來抄去有提高, 看你會抄不會抄! Spring 是 java 開發(fā)者,永遠(yuǎn)繞不開的結(jié)。 Spring 是非常值得開發(fā)者來學(xué)習(xí)的, 以目前 Spring 在 java 領(lǐng)域的統(tǒng)治性地位, 可以說學(xué) java 就是在學(xué) Spring 。但是作為新入門的開發(fā)人

    2023年04月15日
    瀏覽(21)
  • CRM系統(tǒng)化整合從N-1做減法實踐

    京銷易系統(tǒng)已經(jīng)接入大網(wǎng)、KA以及云倉三個條線商機,每個條線商機規(guī)則差異比較大,當(dāng)前現(xiàn)狀是獨立實現(xiàn)三套系統(tǒng)分別做支撐。 2022年下半年CRM目標(biāo)是完成9個新條線業(yè)務(wù)接入,完成銷售過程線上化,實現(xiàn)銷售規(guī)則統(tǒng)一。 前端實現(xiàn)數(shù)據(jù)存儲與邏輯代碼耦合一起,無法復(fù)用,無

    2024年02月16日
    瀏覽(19)
  • 【本站最全系列】(c#系統(tǒng)化學(xué)習(xí)寶典)—精華圖文提煉核心

    【本站最全系列】(c#系統(tǒng)化學(xué)習(xí)寶典)—精華圖文提煉核心

    ?????個人主頁 :@元宇宙-秩沅 ????? hallo 歡迎 點贊?? 收藏? 留言?? 加關(guān)注?! ????? 本文由 秩沅 原創(chuàng) ????? 收錄于專欄 : unity之c#專題篇 ?[【Unityc#專題篇】之c#進(jìn)階篇】 ?【Unityc#專題篇】之c#核心篇】 ?【Unityc#專題篇】之c#基礎(chǔ)篇】 ?【Unity-c#專題篇】之

    2024年02月08日
    瀏覽(63)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包