C++與C#對比學習:類型系統(一)

來源:互聯網
上載者:User
文章目錄
  • C++ 基礎資料型別 (Elementary Data Type)
  • C#基礎資料型別 (Elementary Data Type)
1.類型系統簡介

我們認識事務時總喜歡先分個類,然後研究每個各類的特性.在程式設計語言裡面把也會把所有基本內容分門別類.

你首先想到的自然是int,long等基礎資料型別 (Elementary Data Type),然後就是自訂的各種類型(class).這樣分門別類有蠻多的好處.一是可以針對不同種類的資料在記憶體中分配不同大小的記憶體塊,二是可以減少錯誤.因為不同類型的資料會具有不同的特性,可以進行不同的操作.比如會檢查函數參數類型,如果類型不符在編譯時間期(靜態類型),或運行時期(動態類型)可以給你報錯.或者兩者的結合. 另外還可以起注釋的作用,基礎類型可能不太明顯,但自訂類型就明顯了啊,通過不同的類型名字和函數名字就可以多少理解到一些邏輯上的意義.

不同的類型也是對底層01位元組的抽象與封裝,在機器層面看來不存在任何類型的概念,全部是0101.

 

強型別(弱類型) , 靜態類型(動態類型)

估計很多人都被這幾個概念搞暈了.我也弄得暈乎乎.

首先要明白的是這4個概念本身不是特別專業,特別明確的術語.然後大家的使用的時候也不是嚴格按照某個標準來用.各種程式設計語言的實現也可能是混合使用了這幾個概念.所以我們要說某個語言是屬於強型別或靜態類型的話其實不一定準確的.

強型別與弱類型:

所謂強型別嘛嚴格的說就是定義了一個變數類型後它就只能是這個類型了,不能再變成其他的,與強型別相反的就是弱類型了.比如你的社會安全號碼定了後肯定不能再換一個的.從這個最嚴格的意義上講C++,C#都不能算強型別語言了.但一般我們也講它們是.反正都是在模糊的使用這個術語.C++,C#中各種數值間可以任意轉換(當然有些是隱式轉換,有時得顯式轉換).當然大部分時候我們只從隱式轉換的角度來講,如果啥類型都可以隱式轉了才認為是弱類型.比如 a = "3";  b = 2 + a; //如果b能得到結果5則一般認為這樣的類型就是弱類型了.

 

靜態類型與動態類型

靜態類型指在編譯期就去檢查類型,所以每個變數都必須用一個類型去指定.比如int num;而動態類型在編譯的時候不會去檢查類型,在啟動並執行時候才確定.比如直接來個num = 9;

num = "99".很容易看出靜態類型的優勢是在編譯期間就可以給你去做些類型檢查,限制可以根據類型資訊做一些最佳化.而動態類型在編譯期間根本看不到類型資訊,自然不會做啥類型檢查和最佳化之類的了.

 

2.基礎資料型別 (Elementary Data Type)

C++ 基礎資料型別 (Elementary Data Type)

變數命名規範

c++變數名中可包含字母,底線,$,數字.但第一個字元不能是數字.

C#變數名中可包含字母,底線,@,數字.但第一個字元不能是數字.如果用@出現在變數名中只能在最開頭.並且只能出現一次

c++,C#變數名都是區分大小寫,VB是不區分大小寫.

 

******************************************************************************************************

類   型                         位元組數

bool                             1

char                             1    

wchar_t                        2      (寬字元類型,儲存Unicode代碼值.用法wchart_t  letter = L'a')

short                             2

unsigned short             2      (unsigned 表示無符號,只能取非負數.unsigned short num = 123U ;   //數字後面的U可加可不加)

int                                 4       (整形預設為int,long型需在後加L,如long lNumber = 123L;  //L可加可不加)

unsigned int                 4         (可簡寫為unsigned)

long                              4          (貌似不同的編譯器中不一樣,有時會是8,偶也不太確定)

__int64                          8    (貌似不是標準的,vs擴充的)

unsigned long              4

float                              4    

double                          8   

long double                  8        (有些地方貌似是12,貌似不是標準的,vs擴充的)

******************************************************************************************************

C#基礎資料型別 (Elementary Data Type)

******************************************************************************************************

類   型                         位元組數

bool                             1

char                             2      (相當於C++中的wchar_t)

short                            2

ushort                          2

int                                4       (整形預設為int,long型需在後加L,如long lNumber = 123L)

uint                              4

long                             8

ulong                           8

float                             4    

double                         8     (浮點型預設為double,聲明float型要加F,如float fNumber = 12.3F)

byte                             1     (只能取非負數)

sbyte                           1     (可以取負數)

decimal                       16

******************************************************************************************************

詳細解釋

布爾類型

C++中的布爾類型實際是是個整數值.所以其他整數也可以當成bool值來用.不過它們之間的轉換有點特殊.

true 轉換成整數是1,false是0.

所有非0整數轉換成bool是true.所有0轉換成false

所以if( true )與if( 123 )       , if( false )與if( 0 ) 是等價的.

bool   num = 123;

int   no = num + 1;  //結果是2,因為num會被先轉換成1

由於其他數字能轉換成bool值,所以很容易犯的一個錯誤就是在判斷語句變成指派陳述式了.

比如:  int num = 123;

if ( num = 100)   //本來是想寫成num == 100的.結果寫錯了變成指派陳述式.此時不會出錯.這個語句變成等價於if ( true ).此時雖沒出錯,但表達的意思完全不一樣了

為了不再出現這樣的錯誤,C#做了一些改進.bool類型不再是整數值,不能和其他整數進行運算和轉換.

所以在C#中 :int num = 123;   if( num = 100 )這樣的語句不會再存在,會當成語法錯誤.

當然如果要出現這樣的情況 bool check = false;     if ( check = true )   //這就沒辦法了,當然最好的辦法是如果某個值是布爾值時直接當條件去判斷,不用再去和true ,false比較.寫成if ( check )就行.

字元類型

C#相當於去掉了C++中的char類型.只保留wchar_t類型,而C#中還是用char這個名字.

整型

首先是C#把C++中的unsigned 簡化成u,寫起來方便多了.ushort就等價於unsigned short.

其次C#中多出了一個類型byte,佔用空間為一個位元組.其實這可以和c++中的char對應,剛好也是一個位元組,並且實際上也是個整數

另外C#中的long型佔8個位元組,而且C++中的long貌似根據編譯器不同會不一樣,有時4位元組有時8

浮點型

C#和C++浮點型都有float,double沒啥太大區別.不過有一個書寫的小區別.

在整型中c#,c++賦值時無符號,或者long型,數字後面的尾碼U,L可寫可不寫.

但在C#浮點型中float num = 123.12F;    //float賦值必須加尾碼F,當然小寫f是一樣的

double  eno = 123d;   //尾碼d可寫可不寫

C++中float,double是沒有尾碼的.

在C#中之所有比較注重右值(字面值)的尾碼書寫問題,我覺得應該是因為C#中有個類型推斷的特性.就是可以這樣命名變數: var somevalue = 123f;

關鍵字var可以替代任何變數類型,但C#不像javascript,它可是強型別的.所以編譯時間就必須確定具體類型是啥,所以必須通過右值推斷出變數具體是啥類型.

此時尾碼就非常有用了,因為123d, 123f, 123是三種不同的類型.分別代表double,float,int類型.

在數字沒有尾碼的情況下,C#預設是這樣判斷的,如果有小數,比如123.11就當成double,整數的話124這樣的就預設為int.

在float num = 123.12f;//這樣的賦值中如果寫成123.12會出錯.因為123.12預設是當成double型.而double型不能隱式轉換成float型的.

而像long lo = 123;//是因為整數123能隱式轉換成long

float fl = 123; //整數123能隱式轉換成float

另外C#中多了個浮點類型,decimal ,佔16個位元組,表示小數可以很精確,主要應用在金融領域,計算跟有錢相關的數字啊.因為差幾個小數那就是白花花的銀子啊,所以是能精確就精確啊.decimal定義變數時是    decimal    money = 123.12m; //加尾碼m.當然也可以省略

不過C++中也有個long double.有些編譯器中是8位元組,有些是12,精確度還是沒decimal高

3.值溢出問題

在c++中,如果賦值時值溢出了,不會報錯,只是得到個錯誤的值.比如short sh = 65534; //此值超出了short的範圍,但不出錯,只是sh得到的值為-2.

而在C#中如果這樣賦值 short sh = 65534;//編譯不會通過,當成錯誤來處理

不過在進行類型轉換時,C#對值溢出做了些特殊處理.

預設情況下C#跟C++一樣,對溢出值不報錯,直接給個錯誤結果完事.

比如int num = 65534;

short sh = (short) num;   //sh的值為-2;

但是如果要做溢出檢查的話必須得加關鍵字checked.用法很簡單,寫上關鍵字checked,然後加個中括弧,中括弧裡面所有代碼在做類型轉換時要檢查溢出.

checked

{

     int num = 65534;

    short sh = (short) num; 

}

這樣的話編譯時間不會出錯,但運行時會有個overflowexception異常.如果你代碼中有用checked去做溢出檢查那最好要用try catch這樣的異常處理去捕捉那異常.

另外如果你在checked括起來的代碼中有一部分又不想要溢出檢查就再加個unchecked關鍵字,然後把那一部分代碼中括弧括起來就行了.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.