程式語言為什麼有變數型別這個概念?

時間 2021-05-07 07:59:21

1樓:劉志軍

並不是所有語言的變數都有型別啊

python中的「變數「(嚴格來說是name),是沒有型別這一說的。

例如:a=1

b="hello"c=

[1,2

,3]a, b, c 3個變數都是沒有型別的,真正有型別的是後面那個值,1 是整數型別, "hello" 是字串型別,[1,2,3] 是列表型別。

其實python中的「變數」跟生活中「名字」是一樣的。名字肯定是沒有型別的,例如乙個叫」阿三" 的可以指某個人,也可以指阿貓阿狗,具體看「阿三」這個名字作用在誰身上。

2樓:琴獸布儒

因為不同型別變數所需要的記憶體空間大小不同。宣告了型別,編譯器或直譯器好給它們安排儲存空間。

這就好像35碼的腳配35碼左右的鞋,42碼的腳配42碼左右的鞋。你買鞋也是先跟賣家宣告腳尺寸吧。

不是所有人都能穿得上35碼的鞋,但也總不能讓所有人都穿50碼的鞋吧?不合腳且浪費。

為什麼變數之間占用儲存空間不同?因為二進位制表示和其他人為規定的原因。

3樓:小宇子

計算機沒有變數這個概念,程式語言之所以有變數這個概念是為了抽象出來為人類提供方便的。

b語言好像就是沒有變數型別的,包括c語言也經常用void *來代表各種型別。這時候就需要人工來解釋變數型別了。

越是高階型別的語言,抽象的成次越高,現在的語言基本都是以物件為單位,對基礎型別進行了再次的封裝,但對計算機來說記憶體只是記錄簡單的01而已。

4樓:笑談股金

哈哈,問題看似簡單,其實不好回答,說說我的理解吧,不對的還請指教

1、為什麼存在變數:程式設計就是為了解決實際的問題而產生的,實際的一類問題不會一成不變,所以需要變數表示變化的元素,如果一場不變就不用程式設計了,直接用文件就可以了。

2、變數即為變化的元素,為了方便表示變化的元素,以及方便計算機記憶體儲存和cpu處理,需要規範變數,把變數分類,於是乎就有了變數型別。比較好規範的變數就用基礎變數型別,不好規範的就用堆。

5樓:郭斯特

因為計算機底層只能處理0和1這樣的二進位制數字,如果不規定型別,那麼首先布林邏輯值,字元和字串就無法表示了,其次浮點數也自然無法表示了。而且,你不說,計算機怎麼知道應該用幾個byte表示整數呢?這下連整數都無法表示了,一片混亂。

6樓:藍彼得

對於C語言來說,我們用變數來表示資料,變數是對記憶體或者暫存器的抽象。但是只有這層抽象還遠遠不夠,它只能代表乙個記憶體位址(或暫存器),我們無法知道它的大小,也無從知曉該如何解釋和處理其中儲存的資料。於是,我們引入了型別的概念,它就像是一種協議,規定了乙個變數占用多少位元組,以及它的邏輯意義。

型別是程式語言最重要的概念之一,怎麼強調都不過分。

藍彼得:C語言(1)- 變數和型別

我寫的。

7樓:哲學家

程式設計其實是乙個對問題建模的過程。在我們對現實世界的認識裡,把事物分類是乙個很自然很有用的過程,比如「桌子」是一類有腿有平面的家具的統稱,這樣的分類有用嗎?很顯然。

這種分類就對應程式設計裡的型別。完全沒有型別的語言也不是不能有,理論上只能做整數運算的語言也可以實現我們現在能實現的一切(最早的CPU是連浮點運算都沒有的)。但是這會讓對問題建模很困難,比如你要記住「這三個數代表桌子的長寬高」,而不是「這個型別代表乙個桌子」,問題稍微複雜一點就亂套了。

至於型別可以讓編譯器幫助查錯等好處還在其次。注意題主問的是型別,而不是型別檢查。

總而言之,程式設計需要型別,因為人類就是這麼思考問題的。

8樓:

應該是從底層硬體演化而來的,一開始只能操作定點數,這時的「程式語言」中是不存在型別概念的,後來加入了浮點數的支援,反映在程式語言(Fortran)中就是,程式語言中有浮點數和整型數的區別。緊接著底層硬體越來越精細化,程式語言中出現了對應的精細化的型別,比如int8,int16, int32,int64, float16, float32,float64等等。再緊接著硬體繼續精細化,效能進一步增強,而程式語言為了解決軟體專案越來越大,越來越複雜的問題走向了與底層硬體「脫節」的發展中,它們以原始的基礎型別(int*和float*)為基礎發展出了聚合型別,函式型別,物件型別等等,這些內容擴充套件了原本型別的概念,型別不再是底層硬體的直接對應物,變成了一種更加抽象的概念,它們對軟體開發帶來了些許好處。

總的來說,一開始的原始的型別概念是從底層硬體中對應來的,但隨著程式語言的發展,型別概念發展了,變成了現在的亞子。

9樓:Junn熊

就好比人有名字、年齡、身高、婚姻狀態等等不同屬性,各屬性你總得給它歸個類,每個類都有不同的資料型別來表達它,比如名字是個字串吧,年齡又是個正整數,等等

10樓:曲晉雲

舉個最簡單的例子吧,同樣是比較大小,對於整數型別,12 > 2;對於字串型別,「12」< "2"。你看,如果不指定變數型別的話,連比較個大小都會出現歧義。

11樓:午時葵

乙個老生常談的觀點:型別是值的抽象域。

如果我們希望在程式執行之前處理形如 114514 + "1919810" 這樣的問題,那最節省成本的辦法是……使用抽象解釋(

於是型別檢查也只不過是一種「你不做不行的靜態分析」。

假如想把這種通俗說法稍微嚴格化一點的話,那麼無非就是具體域 裡裝著一堆值,抽象域 裡裝著一堆型別,有個full的「變型別函式」 把具體域映到抽象域,還有個faithful的「變值函式」把抽象域映到具體域。如果有個具體的computational content(程式,表示式,whatever) 接受乙個值輸出乙個值,那麼我們就能算的出抽象域上必定有乙個 接受乙個型別返回乙個型別並且滿足對於任意 有並且 。前者是「是 的精確抽象」的對偶,後者恰好是「 是 的最佳抽象」的定義。

關於為什麼不要求 是Galois connection,甚至都不提 & 上的偏序關係:假如我們沒有某種subtyping機制,那就沒法對關於「近似」的話題說很多,要求 或是 都是很荒謬的事情, 也只能是拿來充數走個過場的東西。而如果我們的語言裡支援subtyping,那這種近似可能會更有「抽象解釋意味」,也更好看一點。

12樓:bjikl

簡單來說是因為算力,資源,以及人力有限,不得不做的折中。

打個比方,只要位數足夠,我可以表示任何有理數。但問題是,位數增大,帶來的代價是巨大的,而大多數場合只需要表示有理數的乙個子集就行了。

比如,人民幣計算的場合,對精度要求很高,但對動態範圍要求不高,這時候整數就更加合適。

比如科學計算,對精度要求不是很高,對動態範圍要求更高,這時候浮點數顯然更加合適。另外科學計算對計算速度要求很高,於是有了int8x16x4這種奇怪的型別。

再比如深度學習,對精度和動態範圍要求都不高,這時候可以用fp16,int8,int4甚至XOR。

還有一些型別是為了可讀性,可維護性考慮,這種例子就更多了。

對應到計算機底層,反而是沒有型別的,所有的東西反正都是有限位數的二進位制而已。

13樓:digolds

因為現實世界有很多態別的資訊需要記錄,比如人名、年齡、身份證號碼以及更加複雜的復合資訊。

計算機為了模擬現實世界的問題,它需要各種型別的變數來記錄這些資訊。

14樓:劉世超

因為實現乙個萬能型別而用它替代所有其他專精某一領域的型別是困難而不經濟的。沒有一款硬體能做到,落實在閘電路上總要對這些bit所表示的資訊有某種假設和約定的。

比如int32能表示的數,ieee754的double都能表示,但代價是多了一倍的儲存和頻寬占用,而且浮點的表示法決定了其加法和乘法都比整數需要更多的硬體開銷。

15樓:hhpy

變數型別是告訴機器用多大的記憶體去存這個變數的值。

比如 int a; 用4個位元組去存乙個int型別,當你用到a的時候,機器會從a的位址讀取4個位元組的資料。

所以可以把變數型別看作是對底層的封裝,如果沒有型別,那麼你需要用乙個for迴圈去a位址讀取4個位元組資料。

乙個位元組=8bit,最大存256(0-255),所以乙個int型別最大存256*256*256*256=4294967296

一半存正數一半存負數4294967296/2=2147483648正數部分(無符號)0到2147483647負數部分(有符號)-1到-2147483648所有的程式語言都有變數型別。

16樓:Leon Xue

為什麼程式語言有變數型別的概念?

不如說,本來任何形式的交流中,就必定都存在「型別」的概念。只是,用你的話說,「百姓日用而不知」。自然語言中,都省略了「常量」、「變數」、「型別」定義的表達,大家依據上下文自動套用罷了。

「如果我們是最初的那批程式語言的設計者,我們能夠理所當然地想到為變數設計型別這一固有屬性嗎?」——當然!這個屬性確實是「固有」的,設計的只是,是否作為乙個顯式的語句。

而對於編譯程式來說,自然是語法結構越簡單精確、上下文依賴越少,越容易處理。且不說最初的計算機效能有多可憐,就算那時是突然冒出就超高效能,你要設計乙個高階的模糊語言,首先也得設計乙個簡單精確的典型計算機語言,再用它程式設計呀。

計算機語言中,其實也有很多不區分「變數型別」的,即使是初期。那些實質是,功能簡單,只支援兩三種資料型別,並在常數端附加特定符號來區分。

17樓:知則

這是乙個分好多層次的問題。

首先,從數理邏輯上來說,最初引入型別系統是為了避免悖論。例如「包含所有不包含自身的集合的集合」,這就是乙個會導致矛盾的集合。首先它肯定包含了自然數、實數這些集合,因為自然數集合只包含各種自然書,而沒有乙個元素叫做自然數集合,同理,實數集合裡全是實數,也沒有乙個元素叫實數集。

但是這個特殊的集合是否包含它自身呢?如果它包含自身,根據它的定義它舊不應該包含自身。如果它不包含自身,根據定義它就應該包含它自身。

處理這個問題的乙個方法就是給集合分類別。我舉乙個簡化的例子,我們把自然數、實數之類一般不看作集合的東西稱為「元物件」。把僅僅由元物件組成的集合稱為一階集合(例如自然數集合,實數集合都是一階集合)。

把含有一階集合的集合稱為二階集合。以此類推,把含有n階集合的集合稱為n+1階集合。這樣,我們就能避免那種矛盾的定義。

在我們的新約定裡原來的句子應該精確表述為「包含所有不包含自身的一階集合的集合」,因為它包含自然數集合,所以它是二階集合。而它的定義只是針對一階集合的,所以它肯定不包含自己。這樣,矛盾就被避免了。

在這個例子中,一開始產生問題的根源就在於「集合」這個概念沒有分類,過於龐大。引入型別系統後,我們基於經過限制的型別進行表述,就能避免矛盾。當然了,避免矛盾只是引入型別系統的最初動機,後來型別系統又有各種各樣的發展,以至於有的型別論是可以替代集合論作為數學基礎的。

在計算機的實踐中,其實幾乎遇不到理論上的邏輯悖論。用可數無窮的自然數來編碼任何有限的東西都是綽綽有餘的。不分型別地把任何計算機要處理的東西都統一編碼到一套方案裡不是不行。

但是,這樣會造成編碼非常冗長。舉個例子,我首先給整數做了個64位編碼,那麼0到2的64次方肯定是不能重複使用了。現在我又有幾萬漢字要編碼,就得再2的64次之後追加幾萬個碼位。

然後我又想處理64位的浮點數,又得再追加2的64次個碼位。然後我又想給機器指令編個碼,給影象或者聲音編碼……這樣下來,每次都需要開闢新的碼位,編碼單位的長度就總也不夠用,需要不斷的追加。

如果區分型別的話,每個型別需要的最大位元組長度是固定的,而且沒有其他編碼的干擾,所有碼位都可用。這比起所有東西都編碼到一起要節省碼位得多。那麼問題來了,都寫作0x0001的兩個編碼,如何區分它們各自的型別呢?

方法是給型別也編個碼,用型別碼加資料碼來同時說明編碼的型別和資料。可這不是又回到所有型別一套編碼的情況裡了麼?如果你只表示乙個數字或者乙個字元自然是這樣。

比如分開編碼型別碼需要8位,資料碼需要16位的情況,如果混起來編碼可能需要的碼位也不超過24位。乙個字元用24位的混合碼編和用8+16的方式編碼似乎沒差別。但當同類資料聚集的時候,分類編碼的優勢就顯現出來了。

例如我需要編碼100個字元,那麼混合編碼需要2400位,但對於分類編碼,不論資料多長,只要資料型別中間不變,都只需要乙個型別標記,因而只需要8+1600位。

分類編碼的另乙個作用是方便繫結資料和對資料的操作。對於自然數而言加減乘除是有意義的,但進行與或非運算就不一定有意義。對於邏輯值來說,與或非是有意義的,但一般不進行加減乘除。

對於字元來說,加減乘除和與或非基本都沒有意義,反而是組成字串以後的拼接和查詢操作有意義。

加、減、乘、除、與、或、非、拼接、查詢這些都是對資料的操作。由於它們的功能各不相同,在計算機中自然需要用不同的指令來表示它們。而歸根結底,就是要給它們起不同的指令名,然後用不同的自然數表示不同的指令。

這還是乙個編碼問題——給操作編碼。

由於操作的數量並不多,實際上混在一起編碼也是可以的(一般來說彙編指令就是這樣的操作,浮點數加法和整數加法在一張操作碼表裡編碼)。但是這很不方便人的記憶。對於人而言,雖然浮點數加法和整數加法的底層實現不一樣,但都是加法,都可以用加號表示。

如果有型別系統,計算機就可以根據加號左右資料的型別自動判斷使用哪一種操作。函式過載就是這種思想的推廣應用。

從人的角度來說,所有型別混在一起編碼還有乙個很大的問題——編碼本身只是乙個數字不能體現編碼物件本身的性質。例如我們都知道1平方公尺不能和1公尺加起來,字元之間沒有加減運算可言。但是,如果混合編碼之後,它們都只是乙個自然數而已。

如果你錯誤地進行上述操作,計算機並不能幫你發現這些問題。

但有了型別系統之後,你可以定義哪些型別之間可以運算,哪些不能。這樣,被編碼物件之間的關係也就可以體現出來了。計算機通過型別檢查,就能把原本需要人工語義檢查才能發現的錯誤給找出來。

所以說,型別實際上是編碼物件之間關係的一種方式,是更高質量程式設計的基礎

c語言有辦法判斷(比較)變數型別嗎?

囧天大聖 你可以試一試函式過載來模擬一下,雖然沒那麼完美int Type int var int Type unsigned int var int Type float var 之後這麼識別,反正最後編譯器會優化掉的int int var 15555 float fvar 45.9L if Typ...

為什麼有些程式語言的型別推斷可以推斷函式引數,有些不會,哪種更好?

clears Pan 強答加不請自來。js應該是很極端的例子了吧,他允許程式設計師不宣告所有變數的型別,全是編譯器自己推斷。結果是 執行同樣的演算法js幾乎是最慢的。問題是 js本身在前端,很多時候並不需要太複雜的演算法,基本只根據使用者的輸入進行相應的反饋。所以即使慢一點,也在使用者可接受範圍內,...

程式語言用let等關鍵字宣告變數有什麼好處?

方應杭 如果沒有 let var,你如何得知 a 2 是在宣告 a 還是在對已有的 a 進行賦值呢?你不得不通過其他的特性來消除歧義。 望山 主要是用來明示這個地方你打算引入新變數,而不是使用前面 包括上層函式或全域性 已經出現過的變數,主要是給人看的,順便也能減少電腦進行語法分析的工作量。強型別語...