日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++教程】01.基本概念

發(fā)布時間:2024/9/30 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++教程】01.基本概念 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第一章 基本概念

前言

這一章或許會比較枯燥,想直接實際操作C++編碼的可以直接跳過。此文章有許多個人心得,非原則性的說法見諒,如有常識性的錯誤,歡迎提出。

1.計算機(jī)與二進(jìn)制

眾所周知,計算機(jī)和數(shù)學(xué)密切相關(guān),屬于一門科學(xué)。如物理、生物和化學(xué)一樣,通過邏輯定義來解釋世間的事物。就說物體的運(yùn)動規(guī)律吧,前有亞里士多德提出“力是物體運(yùn)動的原因”,后有牛頓提出“力是改變物體運(yùn)動的原因”,再有愛因斯坦說“世界不存在力,質(zhì)量造成時空彎曲,從而形成了物體的運(yùn)動軌跡”。所以計算機(jī)實際是一種,以二進(jìn)制為基礎(chǔ)形成的邏輯方式。計算機(jī)所顯示的圖像、音頻、文本,皆是由二進(jìn)制所表示;數(shù)據(jù)通過電線傳輸通過電信號的高低形成了二進(jìn)制序列;數(shù)據(jù)在硬盤上存儲也是通過改變磁碟的磁性來實現(xiàn)的,最終識別磁性轉(zhuǎn)化為二進(jìn)制序列。所以對計算機(jī)和二進(jìn)制的理解,是非常重要的,或許在C語言老師講的時候并不會認(rèn)識到這一點是多么的基礎(chǔ)和重要。

所謂進(jìn)制就是表示數(shù)字的方法,滿幾進(jìn)一位。比如常用的十進(jìn)制,也就日常生活用到的,0-9來表示數(shù)字,如果人有12個手指,或者能夠很方便的使用腳趾,可能現(xiàn)在使用的就是12進(jìn)制或者20進(jìn)制。計算機(jī)的基礎(chǔ)是二進(jìn)制,也就是只有0和1兩個數(shù)字。之所以采用二進(jìn)制,是由于電路便于識別高低電平,半導(dǎo)體的硬件特性可以組合形成邏輯運(yùn)算。比如代碼中的邏輯與、邏輯或、邏輯非運(yùn)算,在電路中可以用晶體管組合形成,玩過《我的世界》的同學(xué)應(yīng)該知道在游戲里面可以通過紅石電路實現(xiàn)簡單的數(shù)值計算。現(xiàn)在的CPU集成的晶體管數(shù)量已經(jīng)在100億的數(shù)量級了,所以額外說一句,在代碼中糾結(jié)一個加法和乘法的效率區(qū)別,對于新手來說是沒有必要的,反而是錯誤的。

下面來計算一下幾個常用的值,1位二進(jìn)制可以表示0或1,也就是1位二進(jìn)制可以表示2個值。如果我們要表示2這個數(shù)字,就必須進(jìn)一位,用兩位二進(jìn)制表示,也就是10。所以表示3的二進(jìn)制為11,表示4的二進(jìn)制為100。那么不難得出二進(jìn)制位數(shù)和可表示值的數(shù)量關(guān)系:

其中N為可表示值的范圍,n為二進(jìn)制的位數(shù)。那么8位二進(jìn)制可表示的值數(shù)量為2的8次方,也就是256。由于0占一個位置,所以8位二進(jìn)制表示從0開始的數(shù)字,就可以表示[0,255]。如果用一半表示負(fù)數(shù)那么就是[-128,127],當(dāng)然以上只是常用的表示范圍,要是自己想的話也可以表示[1,256]或者[10000,10255],反正只能區(qū)分256個值而已(注意這里中括號表示的是閉區(qū)間,如果是開區(qū)間則用小括號表示,和數(shù)學(xué)上的概念一致)。

8位二進(jìn)制就稱為一個字節(jié),關(guān)于數(shù)字和類型的大小后面的章節(jié)再詳細(xì)介紹。

2.編譯原理和圖靈機(jī)

當(dāng)老師講到編譯原理的時候,編譯器經(jīng)過了N個階段,最終才生成了可執(zhí)行程序,這個時候我們已經(jīng)迫不及待了,對程序編譯的過程毫不感興趣,實際上這一階段也需要理解一下。

我們所鍵入的C++代碼是我們能夠看懂的(或許久了也看不懂了),而計算機(jī)只能識別二進(jìn)制,所以編譯器即是一個將高級語言(C++)的代碼按一定規(guī)則,轉(zhuǎn)化為機(jī)器可識別的機(jī)器碼的工具。也就是高級語言->匯編語言->機(jī)器語言的過程。幸好編譯器幫我們實現(xiàn)了這些功能,不然學(xué)編程必然是門檻極高的一件事。可是現(xiàn)在由于底層堆疊的層數(shù)太多,導(dǎo)致碼農(nóng)叢生,這也就不奇怪了。不理解計算機(jī)的原理,不接觸C語言,我覺得應(yīng)該難以成為高手,當(dāng)然除了只是簡單利用編程進(jìn)行一些計算和研究的人,沒有必要研究那么透徹。再底層一些的工作也就是接觸匯編與操作系統(tǒng),做CPU相關(guān)的研發(fā)。不過國內(nèi)的發(fā)展順序和國外恰好相反了,一開始的計算機(jī)通過卡片打孔來輸入數(shù)據(jù),也就是機(jī)器語言,后面為了方便人理解和編寫,就有了匯編語言。最初的操作系統(tǒng)也由匯編語言寫成,而匯編語言不夠結(jié)構(gòu)化,才有了高級語言。由于程序規(guī)模越來越大,也就有了更多的框架與結(jié)構(gòu),比如C++,以面向?qū)ο缶幊趟枷牒头椒ㄟM(jìn)行開發(fā)。而腳本(虛擬機(jī))語言為更上一層的事物,它并不直接編譯成機(jī)器語言,而是直接調(diào)用已編譯好的機(jī)器碼,比如Java與C#。

但是萬變不離其宗,所有在計算機(jī)上執(zhí)行的程序都是一層一層向下調(diào)用,最后通過二進(jìn)制的邏輯運(yùn)算,CPU等硬件的處理,最終依賴了真實世界的法則。

圖靈和馮諾依曼被稱為計算機(jī)之父,圖靈提出的圖靈機(jī)就像現(xiàn)代計算機(jī)理論上的執(zhí)行方式。程序像一條長紙帶,紙帶上記錄了符號,機(jī)器通過讀取當(dāng)前紙帶位置的符號來做運(yùn)算將結(jié)果記錄到紙帶上,并且移動紙帶到特定位置。而馮諾依曼計算機(jī)則是圖靈機(jī)的工程化實現(xiàn),構(gòu)成了現(xiàn)代計算機(jī)的核心理論。其實你只要用心想一想,自己面對的顯示器、手機(jī)所呈現(xiàn)的內(nèi)容,到底是如何由一些芯片電路驅(qū)動的,就會覺得計算機(jī)實際上是一種理論與實踐的結(jié)合,軟件只不過是硬件上的抽象理論,而硬件才實現(xiàn)了軟件所需的功能。就像汽車華麗的外表掩蓋了內(nèi)部的機(jī)器運(yùn)作,如果要研究如何制造汽車,光關(guān)注于軟件層面的理論,那是萬萬不得行的,所以學(xué)習(xí)編程語言當(dāng)然也需要稍微理解背后的原理。至于開發(fā)國產(chǎn)CPU,實現(xiàn)操作系統(tǒng),發(fā)明一門編程語言,實現(xiàn)計算機(jī)硬件一整套的生產(chǎn),這些事情就需要天才的您來完成了,我的能力有限。

3.層級結(jié)構(gòu)

層級結(jié)構(gòu)是非常常用的計算機(jī)結(jié)構(gòu),無論是硬件與軟件,層次都很明顯。就像堆積木一樣,從最底層的內(nèi)容不斷積累才形成了現(xiàn)在的計算機(jī)體系。就說硬件層面上的數(shù)據(jù)保存吧,最基本的是硬盤->內(nèi)存->CPU,由于數(shù)據(jù)最終需要通過CPU處理,硬盤和內(nèi)存的二進(jìn)制數(shù)據(jù)就需要想辦法傳輸給CPU,由于(機(jī)械)硬盤通過磁盤保存數(shù)據(jù),讀取數(shù)據(jù)需要硬盤里的磁頭高速旋轉(zhuǎn)來讀取數(shù)據(jù),所以等硬盤的數(shù)據(jù)傳遞給CPU就太慢了。內(nèi)存作為主要的數(shù)據(jù)緩存,以不同的硬件實現(xiàn)來保存數(shù)據(jù),并且可以快速的傳遞給CPU,當(dāng)然缺點就是容量更小,且斷電不能保存。而CPU實際還帶有高速緩存,也就是CPU之內(nèi)的“內(nèi)存”,速度更比內(nèi)存快,但容量也更小。CPU的高速緩存一般分3級,最常用的數(shù)據(jù)放置到一級緩存,這樣就能最快的讀取。如果放不下就只能往后排,最后就只能放到內(nèi)存。內(nèi)存如果也放不下,程序的編寫者就需要動態(tài)的加載數(shù)據(jù)到內(nèi)存,當(dāng)然用時從硬盤加載到內(nèi)存就會很慢了。這也是為什么有些游戲需要加載時間,下面舉例:

小明點開一個程序,這時程序(就像一張紙條)從硬盤讀取到內(nèi)存,再從初始位置執(zhí)行,通過CPU的運(yùn)算,改變處理的位置,并改變程序在內(nèi)存中的數(shù)據(jù)。這樣就是程序執(zhí)行的基本過程。當(dāng)然這只是大概的邏輯,其中細(xì)節(jié)就太多了。每一個細(xì)節(jié)都被無數(shù)程序員研究過,所以咱們就不研究那么細(xì)節(jié)了。

當(dāng)然上面的層次還可以附加,比如大家所說的“云計算”、“云游戲”。其實原理就是數(shù)據(jù)通過網(wǎng)絡(luò)保存在其他電腦上,或者通過其他電腦處理數(shù)據(jù),自己只輸入數(shù)據(jù)和接收結(jié)果。而“分布計算”是通過網(wǎng)絡(luò)連通許多的電腦來一起計算。

通過網(wǎng)絡(luò)用其他電腦保存數(shù)據(jù),就可以代替硬盤的作用,當(dāng)然就可以視做硬盤之下的一個層次。

軟件上的層次也很明顯,如第二節(jié)所說的,最基本的是機(jī)器識別的機(jī)器語言,然后是匯編語言,然后是高級語言。而軟件開發(fā)時,操作系統(tǒng)提供了API接口隱藏了與硬件的交互,讓一般的程序員不需要和硬件打交道。再之上有通用的類庫,比如解析png、jpg格式的圖像庫,使用字體的freetype庫,3D開發(fā)的DirectX庫,這些可以算一個層次。再之上就是游戲引擎、UI界面庫等。有些游戲提供mod功能,也如同微信小程序,是在應(yīng)用之上提供的開發(fā)功能,也可以算一個層次。這些就像一整條產(chǎn)業(yè)鏈,作為個人很難每一個都精通,當(dāng)然也很難撼動現(xiàn)有的體系。要從頭做起,也是不太可能的事情。

4.計量單位

咱們終于可以說一些比較客觀的東西了,一些有固定定義的內(nèi)容~

首先1位二進(jìn)制,這個叫1位,如同一個開關(guān)可以表示兩個狀態(tài),也可以叫做1bit。

8位叫做1個字節(jié),也就是1byte。而我們經(jīng)常看到的KB單位,即是kilobyte(千字節(jié))。但是在程序員眼里1024才是整數(shù),所以實際上1KB = 1024byte。

所以:

除了字節(jié)的常用說法外,還有字的說法,也就是WORD,這個實際是兩個字節(jié)。DWORD是Double WORD的縮寫,所以實際是4個字節(jié)。現(xiàn)在常用DWORD表示顏色,在各種顏色代碼里我們可以看到0xffff0000或者#afafaf之類的寫法,實際這就是占4個字節(jié)的十六進(jìn)制數(shù)字。

5.C++是什么

C++如同數(shù)學(xué)一般,是定義的一套規(guī)則。至于編譯器如何編譯是編譯器的事情,與C++無關(guān)。你只需要按照我規(guī)定的語法行事即可。所以C++是跨平臺的,無論什么操作系統(tǒng)都可以使用,不過這個也要看你如何使用,如果在Windows平臺使用VS編譯器,并且使用WindowsSDK提供的API,那么就是依賴了平臺。不過依賴平臺是必須的操作,就像你在中國混就得按中國的規(guī)矩來。一般的做法是為不同的操作系統(tǒng)寫不同的代碼,不依賴操作系統(tǒng)的代碼就可以不變。

C++的前身是C語言,C語言由貝爾實驗室于1972年研發(fā)出來。最開始C++名字叫c with class,也即是帶類的C語言。所以C++基本是兼容C語言的,不過卻多了很多語法。而且C++的標(biāo)準(zhǔn)(也就是語法規(guī)則)在不斷的更新,最新的是C++ 20版本,不過對于新手來說可以不用關(guān)心這些。

在2010年的時候我在新華文軒買了我的第一本C++書,不過接下來好幾年都沒看明白,直到高三的時候有了些感覺。為何我要選擇學(xué)C++呢,因為我看到網(wǎng)上說C++比較適合做游戲,于是就入了坑。現(xiàn)在我認(rèn)為C++確實是游戲行業(yè)的不二選擇(或許國內(nèi)不是),C++也比較適合大型軟件的開發(fā),最重要的原因是我認(rèn)為如果不會C語言,就不太可能成為高手,不會面向?qū)ο笠搽y以跟上時代。雖然Java、C#和許多腳本語言比C++簡單很多,也能夠開發(fā)很多有用的軟件。但是吧,要深入研究計算機(jī)編程,學(xué)C++應(yīng)該是比較好的。

結(jié)語

本章大概說了一些基本常識,如果不太理解應(yīng)該是很正常的,很多詞匯我并沒有具體解釋,一下子就會犯迷糊。不要由此失去了學(xué)C++的信心,這只是一個大概的論述。

總結(jié)

以上是生活随笔為你收集整理的【C++教程】01.基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。