第2章C語法基礎(chǔ)_第1頁
第2章C語法基礎(chǔ)_第2頁
第2章C語法基礎(chǔ)_第3頁
第2章C語法基礎(chǔ)_第4頁
第2章C語法基礎(chǔ)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第2章C#語法基礎(chǔ)在上一章里讀者接觸到了第一個C#應(yīng)用程序,雖只是簡單地在控制臺輸出了一句問候語,但它卻充分體現(xiàn)了VisualStudio2008的易用性及C#語言的特點(diǎn)。理解了C#的用途之后,就可以學(xué)習(xí)如何使用它。本章將介紹C#的基本語法知識,通過本章學(xué)習(xí),讀者將了解以下內(nèi)容:理解C#中的數(shù)據(jù)類型。理解常量和變量的含義及用法。理解數(shù)據(jù)類型轉(zhuǎn)換的含義。會運(yùn)用常用的運(yùn)算符和表達(dá)式。2.1C#數(shù)據(jù)類型應(yīng)用任何一種程序語言,需要充分了解它提供的數(shù)據(jù)類型,這樣才能明白它的功能與限制,以便選擇合適的數(shù)據(jù)類型來處理不同的數(shù)據(jù)。例如在平時生活中,我們會用整數(shù)來表達(dá)東西的數(shù)量,而在工程、金融領(lǐng)域我們要用到很高精度小數(shù)。但對計算機(jī)來說,數(shù)據(jù)的含義更要寬泛些,比如說一句話、一個字符等,對計算機(jī)來說都是數(shù)據(jù)。計算機(jī)會用不同的方式來處理它遇到的不同類型的數(shù)據(jù)。2.1.1通用類型系統(tǒng)簡介通用類型系統(tǒng)(CommonTypeSystem,CTS)是一個所有.NET語言都支持的數(shù)據(jù)類型的集合,它定義了如何在運(yùn)行庫中聲明、使用和管理類型,確保這些語言可以相互傳送數(shù)據(jù),體現(xiàn)在.NET語言的互操作性。例如在C#中聲明int類型的數(shù)據(jù)和在VB.NET中聲明的Integer類型數(shù)據(jù),實(shí)際上是通用類型系統(tǒng)中的System.Int32的一個實(shí)例。將數(shù)據(jù)類型內(nèi)置于.NETFramework中的好處是,可以把所有的基本數(shù)據(jù)類型看作是支持某些方法的類,例如,要把inti轉(zhuǎn)換成string,可以寫如下代碼:stringstr=i.toString();在C#語言里,有多種數(shù)據(jù)類型(Type)。根據(jù)數(shù)據(jù)產(chǎn)生時在內(nèi)存中存放的方式,.Net將整個系統(tǒng)的數(shù)據(jù)類型分成兩大類——值類型和引用類型。值類型直接包含數(shù)據(jù)。每個值類型變量都包含有它自己的數(shù)據(jù)備份,因此對一個值類型變量的操作不會影響其他變量。引用類型包含指向?qū)ο髮?shí)例的引用或指針。兩個引用類型的變量可以指向同一個對象實(shí)例,因此對一個引用變量的操作會影響其他引用變量??梢酝ㄟ^下面一個例子來加深讀者對值類型的引用類型的理解。2.1.2值類型【本節(jié)示例參考:\源代碼\chapter2\2.1.1\ValueTypeExample】大多數(shù)編程語言都提供內(nèi)置的數(shù)據(jù)類型(比如整數(shù)和浮點(diǎn)數(shù)),這些數(shù)據(jù)類型會在作為參數(shù)傳遞時被復(fù)制(也就是說,它們通過值來傳遞)。在.NET框架中,這些數(shù)據(jù)類型稱為值類型。值類型通常是像整數(shù)這樣的簡單類型。C#中的值類型包含整數(shù)型、浮點(diǎn)型、布爾型、字符型等。表2.2列出了預(yù)定義的簡單值類型。2.1.3引用類型【本節(jié)示例參考:\源代碼\chapter2\2.1.2\RefTypeExample】引用類型的變量又稱為對象,可存儲對實(shí)際數(shù)據(jù)的引用。類似于在儲物柜里存放的是該物品的地址信息。C#支持兩個引用類型,如表2.4所示。2.2常量和變量變量名表示一條信息的名稱。其實(shí)在之前的程序代碼中,已經(jīng)接觸到過變量,比如在上一節(jié)示例中使用到的a、b、c等,都是string類型的變量。變量的值在程序運(yùn)行過程中可以改變。而常量是一旦定義好后,在程序運(yùn)行過程中其值不變的量。2.2.1變量的聲明和初始化C#是一種“強(qiáng)類型”編程語言,在聲明變量時必須指明它的數(shù)據(jù)類型。聲明變量的作用之一是告訴編譯器要為變量分配多少內(nèi)存空間。就像要將一個物品存進(jìn)儲物間,應(yīng)該事先讓保管員知道,這個物品有多大,以便分配合適大小的儲物柜。大了會浪費(fèi)空間,小了東西放不下,會造成不必要的錯誤。聲明變量的格式如下:數(shù)據(jù)類型變量名;比如,下面的代碼聲明了一個int型的變量i:inti;變量聲明后,可在程序運(yùn)行中,給變量i賦值,或者可以在聲明的時候給變量賦初值。一個變量聲明以后可以多次賦值。在初始化時對變量賦值采用下面的格式:數(shù)據(jù)類型變量名=初始值;doubletotal=34.3D;2.2.2變量命名規(guī)范及編碼規(guī)則在C#中,對變量的命名有一些限制,包括以下規(guī)則:變量名必須以字母開頭。變量只能有字母、數(shù)字、下劃線。不能包含空格、標(biāo)點(diǎn)等。且不能由數(shù)字開頭。變量名不得與C#中的關(guān)鍵字同名。變量名不得與C#中的庫函數(shù)同名。下面給出了一些合法和不合法的變量名:string3str;//不合法,以數(shù)字開頭floattotalcount;//不合法,變量名包含空格intprod2; //合法doubleMain;//不合法,與Main函數(shù)同名doublefloat;//因?yàn)閒loat是關(guān)鍵字,不能用作變量名2.2.3變量的作用域【本節(jié)示例參考:\源代碼\chapter2\2.2.3\ScopeExample】作用域(scope)是指由一個代碼塊或者語言結(jié)構(gòu)約束起來的分層上下文。簡單理解,變量的作用域指可以訪問某個變量的代碼區(qū)域。只有在變量被聲明的代碼塊中,它才能被訪問到,一旦程序執(zhí)行超過某個代碼塊,則該代碼塊中聲明的所有過程級變量都會越界,不能再被訪問到。下面的示例演示了在變量的作用域外訪問變量的情形:for(inti=0;i<10;i++){Console.WriteLine(i);//i在這個循環(huán)里有效}Console.WriteLine("lastvalueofiinloop{0}",i);//在循環(huán)外輸出i的值會出錯2.2.4聲明和使用常量常量就是值固定不變的量。在C#中,可以用const關(guān)鍵字來聲明一個常量。在程序設(shè)計中,往往把一些經(jīng)常用到而值不太可能改變的量定義為常量,而不是直接使用其數(shù)值。例如在計算和圓相關(guān)的問題時,就可以把圓周率定義常量。常量的聲明方式如下:constintPI=3.14;//常量一旦聲明,在程序運(yùn)行中就不能再改變其值注意:和C++不同,在C#中,只能把局部變量和字體段(即類里面定義的變量)聲明為常量。常量有如下特征:常量必須在聲明時初始化。指定了其值后,就不能再修改了。常量值必須能在編譯時用于計算。因皮,不能用從一個變量中提取的值來初始化常量。常量總是靜態(tài)的(用static關(guān)鍵字修飾)。但事實(shí)上,在聲明常量的時候不允許包含修飾符。如下面的一組定義:constinti; //錯誤,沒有初始化constinti=3;//正確constintj=5*i;//正確,編譯器知道i的值intp=3;constintq=p*4;//錯誤,不能用變量值來初始化常量2.3數(shù)據(jù)類型轉(zhuǎn)換所有值類型和引用類型都由一個名為object的基本類發(fā)展而來。在C#中還可以通過隱性轉(zhuǎn)換(不會造成數(shù)據(jù)丟失)或顯性轉(zhuǎn)換(可能造成數(shù)據(jù)丟失或降低精確度)來改變數(shù)據(jù)類型。2.3.1裝箱和拆箱【本節(jié)示例參考:\源代碼\chapter2\2.3.1\BoxingExample】任何值類型、引用類型可以和object類型之間進(jìn)行轉(zhuǎn)換。裝箱是值類型到object類型或到此值類型所實(shí)現(xiàn)的任何接口類型的隱式轉(zhuǎn)換,拆箱是從object類型到值類型或從接口類型到實(shí)現(xiàn)該接口的值類型的顯式轉(zhuǎn)換。簡言之,裝箱就是將值類型轉(zhuǎn)換為引用類型;反之,就是拆箱。如代碼2-4所示,展示了一個簡單的裝箱拆箱操作。代碼2-4裝箱和拆笨:BoxingExample.cs1 inti=10;2 objectobj=i;//隱式裝箱3 objectobj2=(object)i;//顯式裝箱4 if(objisint)//判斷obj是否為int型5 {6 Console.WriteLine("OK");7 }8 Console.WriteLine(obj.GetType()); //System.Int322.3.2隱式類型轉(zhuǎn)換只要能保證值不會發(fā)生變化,類型轉(zhuǎn)換就可以自動進(jìn)行。如下面的一段代碼:bytex=12;bytey=25;bytem=x+y;//錯誤intn=x+y;//正確該段代碼先聲明兩個byte類型的數(shù)據(jù),然后將這兩個byte數(shù)據(jù)相加到另一個byte類型數(shù)據(jù)中,這步操作會提示錯誤,而將byte型數(shù)據(jù)相加到一個int型數(shù)據(jù)中,程序運(yùn)行通過。這是因?yàn)椋褍蓚€byte值相加,應(yīng)返回int型結(jié)果,而不是另一個byte。因?yàn)閎yte包含的數(shù)據(jù)只能有8個位的存儲空間,即其值的范圍只能在0~255之間,所以把兩個byte值相加,很容易得到一個不在這個范圍里的數(shù)據(jù)。而用int型的數(shù)據(jù)來存儲兩個byte型數(shù)據(jù)相加的結(jié)果范圍足夠大,不會有數(shù)據(jù)丟失的危險。在這種情況下,編譯器能順利地通過轉(zhuǎn)換,不用用戶指定對數(shù)據(jù)的轉(zhuǎn)換。2.3.3顯式類型轉(zhuǎn)換使用顯式類型轉(zhuǎn)換,能夠把一種基本數(shù)據(jù)類型轉(zhuǎn)換成另一種基本數(shù)據(jù)類型。類型轉(zhuǎn)換時把轉(zhuǎn)換的目標(biāo)類型名放在轉(zhuǎn)換值之前的小括號里,例如:doublex=12.5d;inti=(int)(x+1);將double型的x加上1轉(zhuǎn)換成int型數(shù)據(jù),賦給int型變量i,最后i的結(jié)果是13。在轉(zhuǎn)換過程中,小數(shù)點(diǎn)后面的所有數(shù)據(jù)都丟失,損失了精度。讀者需要注意,如果對這個double型的數(shù)據(jù)要進(jìn)行多次運(yùn)算,最好先不要進(jìn)行轉(zhuǎn)換,以免誤差累積,造成更大的誤差。在上一節(jié)的例子中,將byte型的x和y相加,其值會自動轉(zhuǎn)換成int型的,如果用戶非要讓運(yùn)算結(jié)果還是byte型,這時候也會要用到顯式類型轉(zhuǎn)換,如下面代碼:bytex=12;bytey=18;bytem=(byte)(x+y);//顯式類型轉(zhuǎn)換,將int型的結(jié)果轉(zhuǎn)換成byte型2.4運(yùn)算符和表達(dá)式C#提供大量運(yùn)算符,這些運(yùn)算符指定在表達(dá)式中執(zhí)行哪些操作的符號。例如常見的+、-、*、/、==、!=、<、>、<=、>=、binary+、binary-、^、&、|、~、++、--和sizeof()等。此外,很多運(yùn)算符可被用戶重載,以便在應(yīng)用到用戶定義的類型時更改這些運(yùn)算符的含義。表達(dá)式的運(yùn)算符指示對表達(dá)式的數(shù)據(jù)進(jìn)行什么樣的操作。2.4.1算術(shù)運(yùn)算符C#中的算術(shù)運(yùn)算符主要是對操作數(shù)進(jìn)行基本的數(shù)學(xué)運(yùn)算,包含+、-、*、/、%。其中%叫模式運(yùn)算符,主要作用是給出除法運(yùn)算的余數(shù),如:7%2=1//表示7除2的余數(shù)是1這里要注意運(yùn)算符+,它除了可以表示進(jìn)行加法運(yùn)算外,還可以實(shí)現(xiàn)字符串連接運(yùn)算的功能。這實(shí)際上是對運(yùn)算符的一個重載。例如在前面章節(jié)中的示例代碼中有這樣的代碼段:stringc="h";c+="ello";第二行代碼等價于:c=c+"ello";這里的運(yùn)算符+實(shí)際上已不能叫做算術(shù)運(yùn)算符了,而應(yīng)該是一個字符串連接運(yùn)算符,詳細(xì)內(nèi)容請參照第3章。2.4.2比較運(yùn)算符C#中的比較運(yùn)算符有==、!﹦、<>、<﹦、>﹦。C#比較運(yùn)算符常用于判斷某個條件是否成立。例如在前面的代碼里有這樣的代碼段:stringa="hello";stringb=a;Console.WriteLine(a==b);//判斷a和b是否相等。其返回結(jié)果為true或false在程序設(shè)計中,經(jīng)常會根據(jù)某個變量的值來決定程序執(zhí)行流程,在判斷值的取值或取值范圍時,就要用到比較運(yùn)算符。詳細(xì)內(nèi)容可以參考第4章程序設(shè)計流程章節(jié)的知識。2.4.3條件運(yùn)算符【本節(jié)示例參考:\源代碼\chapter2\2.4.3\PriorityTest】條件運(yùn)算符(也叫三元運(yùn)算符或是三目運(yùn)算符)是C#里唯一的一個三元運(yùn)算符。它實(shí)際上是if-else結(jié)構(gòu)的簡寫形式。它可以先判斷一個條件,如果條件為真,就返回第一個值,如果條件為假,則返回第二個值。其語法格式如下:條件?值1:值2;假如有這樣一個表達(dá)式:a>b?1:02.4.4賦值運(yùn)算符賦值運(yùn)算符的作用,是將某個初始值或是經(jīng)過運(yùn)算的值賦給某個變量。C#里的賦值運(yùn)算符有:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=。除第一項(xiàng)外的其他賦值運(yùn)算符都是簡化的操作符,如x+=y,它等價于x=x+y。這種簡化的操作符都需要兩個操作數(shù),用于執(zhí)行算術(shù)、邏輯和接位運(yùn)算,改變第一個操作數(shù)的值。2.4.5邏輯運(yùn)算符邏輯運(yùn)算符有&、|、!、^、~、&&、||。其中&和|執(zhí)行按位的“與”和“或”,而~和^執(zhí)行按位的“非”和“異或”。&&和||執(zhí)行布爾的“與”和“或”,而!執(zhí)行布爾的“非”。讀者要注意區(qū)分位運(yùn)算和布爾運(yùn)算。位運(yùn)算是將運(yùn)算的數(shù)據(jù)相應(yīng)的二進(jìn)制數(shù)據(jù)進(jìn)行相應(yīng)的計算。各種二進(jìn)制數(shù)運(yùn)算的結(jié)果如下表2.6所示。2.4.6表達(dá)式表達(dá)式(expression)由操作數(shù)和運(yùn)算符構(gòu)成。表達(dá)式的運(yùn)算符標(biāo)明在操作數(shù)上運(yùn)用了哪種操作。運(yùn)算符可以是+、-、*、/等。操作數(shù)可以包括字面值、字段、局部變量和表達(dá)式。當(dāng)表達(dá)式包括多個運(yùn)算符時,運(yùn)算符的優(yōu)先級控制各個運(yùn)算符執(zhí)行的順序。例如,表達(dá)式x+y*z將以x+(y*z)的形式計算,原因就是運(yùn)算符“*”的優(yōu)先級高于運(yùn)算符“+”。表2.8總結(jié)了C#的運(yùn)算符,運(yùn)算符的分類排列是按其優(yōu)先級從高到低的次序。同一分類的運(yùn)算符具有相同的優(yōu)先級。2.5小結(jié)學(xué)完本章后,讀者將了解以下內(nèi)容。(1)C#中的數(shù)據(jù)類型包括值類型和引用類型。值類型又包含常用的13種簡單數(shù)據(jù)類型,而常用的引用類型包含了object類型和string類型。(2)C#要求在使用變量或常量之前必須要先聲明,并且初始化。常量和變量都有特定的數(shù)據(jù)類型。對于數(shù)據(jù)類型的選擇,需要考慮定義的常量或變量將要存儲的數(shù)據(jù)的范圍,以便選擇合適的數(shù)據(jù)類型。(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論