C#OOP之二 变量和表达式
2.1? C#的基本語(yǔ)法
C#代碼的外觀和操作方式與C++和Java非常相似。初看起來(lái),其語(yǔ)法比較混亂,
不像書(shū)面英語(yǔ)和其他語(yǔ)言。但是,在C#編程中,使用的樣式是比較清晰的,不用花太多的力氣就可以編寫(xiě)出可讀性很強(qiáng)的代碼。
與其他語(yǔ)言的編譯器不同,無(wú)論代碼中是否有空格或回車(chē)符或tab字符(這些字符統(tǒng)稱(chēng)為空白字符),C#編譯器都不考慮這些字符。這樣格式化代碼時(shí)就有很大的自由度,但遵循某些規(guī)則將有助于使代碼易于閱讀。
C#代碼由一系列語(yǔ)言組成,每一個(gè)語(yǔ)句都用一個(gè)分號(hào)來(lái)結(jié)束。因?yàn)榭崭癖缓雎?#xff0c;所以一行可以有多個(gè)語(yǔ)句,但從可讀性的角度來(lái)看,通常在分號(hào)后面加上回車(chē)符,這樣就不能在一行上放置多個(gè)語(yǔ)句了。但一句代碼放在多個(gè)行上是可以的。
C#是一塊結(jié)構(gòu)的語(yǔ)言,所有的語(yǔ)句都是代碼塊的一部分。這些塊用花括號(hào)來(lái)界定(“{”和“}”),代碼塊可以包含任意多行語(yǔ)句,或者根本不包含語(yǔ)句。注意花括號(hào)字符不需要附帶分號(hào)。
所以,簡(jiǎn)單的C#代碼如下所示:
{
?? <code line 1,statement 1>;
? <code line 2,statement 2>
<codeline 3,statement 3>;
}
其中<code linex,statement y>部分并不是正真的C#代碼,而是用這個(gè)文本作為C#語(yǔ)句的占位符。注意在這段代碼中,第2,3行代碼是同一個(gè)語(yǔ)句的一部分,因?yàn)樵诘?行的末尾沒(méi)有分號(hào)。
在這個(gè)簡(jiǎn)單的代碼中,還使用了縮進(jìn)格式,使C#代碼的可讀性更高。這不是某些人的發(fā)明,而是一個(gè)標(biāo)準(zhǔn)規(guī)則,實(shí)際上在默認(rèn)情況下VS會(huì)自動(dòng)縮進(jìn)代碼。一般情況下,每個(gè)代碼都會(huì)有自己的縮進(jìn)級(jí)別,即它向右縮進(jìn)了多少。代碼塊可以互相嵌套,而被嵌套的塊要縮進(jìn)得多一些。
{
?? <code line 1>;
{
? ???? ?<code line 2>;
<code line 3>;
}
<codeline 3>;
?
}
前面代碼的續(xù)寫(xiě)通常也要所近得多一些,如上面第一個(gè)示例中的第3行代碼。
在C#代碼中,另一個(gè)常見(jiàn)的語(yǔ)句是注釋。注釋并不是嚴(yán)格意義上的C#代碼,但代
碼最好有注釋。注釋就是解釋,即給代碼添加描述性文本,編譯器會(huì)忽略這些內(nèi)容。在開(kāi)始處理比較長(zhǎng)的代碼段時(shí),注釋可用于給正在進(jìn)行的工作添加提示,例如“這行代碼要求用戶(hù)輸入一個(gè)數(shù)字”,或“這段代碼由Bob編寫(xiě)”。C#添加注釋的方式有兩種。可以在注釋的開(kāi)頭和結(jié)尾放置標(biāo)記,也可以使用一個(gè)標(biāo)記,其含義是“這行代碼的其余部分是注釋”。在C#編譯器忽略回車(chē)符的規(guī)則中,后者是一個(gè)例外,但這是一種特殊情況。
要使用第一種方式標(biāo)記注釋,可以在注釋的開(kāi)頭加上“/*”,在末尾加上“*/”。這些注釋符號(hào)可以在單獨(dú)一行上,也可以在不同的行上,注釋符號(hào)之間的所有內(nèi)容都是注釋。注釋中唯一不能輸入的是“*/”,因?yàn)樗鼤?huì)被看作注釋結(jié)束標(biāo)記。所以下面的語(yǔ)句是正確的。
/* This is a comment */
/* And so…
????????????????????? …is this!*/
但下面的語(yǔ)句會(huì)產(chǎn)生錯(cuò)誤:
/*Comments often end with “*/”characters*/
注釋結(jié)束符號(hào)后的內(nèi)容(“*/”后面的字符)會(huì)被當(dāng)作C#代碼,因此產(chǎn)生錯(cuò)誤。
另一個(gè)添加注釋的方法是用“//”開(kāi)始一個(gè)注釋,其后可以編寫(xiě)任何內(nèi)容,只要這些內(nèi)容在一行上可即可。下面的語(yǔ)句是正確的:
//? 雙行注釋
但下面的語(yǔ)句會(huì)失敗,因?yàn)榈诙写a會(huì)解釋為C#代碼:
//So is this,
But this bit isn’t.
這類(lèi)注釋可用于語(yǔ)句的說(shuō)明,因?yàn)樗麄兌挤旁谝恍猩?#xff1a;
<A statement>;? //Explanation of statement
前面說(shuō)過(guò)有兩種方法給C#代碼添加注釋。但在C#中,還有第三類(lèi)注釋,嚴(yán)格地說(shuō),這是//語(yǔ)法的擴(kuò)展。他們都是單行注釋,用三個(gè)“/”符號(hào)來(lái)開(kāi)頭,而不是兩個(gè)。
/// 特殊的注釋
在正常情況下,編譯器會(huì)忽略他們,就像其他注釋一樣,但可以配置VS,在編譯項(xiàng)目時(shí),提取這些注釋后面的文本,創(chuàng)建一個(gè)特殊格式的文本文件,該文件可用于創(chuàng)建文檔說(shuō)明書(shū)。
特別要注意的一點(diǎn)是,C#代碼是區(qū)分大小寫(xiě)的。與其他語(yǔ)言不同,必須使用正確的大小寫(xiě)形式輸入代碼,因?yàn)楹?jiǎn)單地用大小寫(xiě)字母代替小寫(xiě)字母會(huì)中斷項(xiàng)目的編譯。
2.2???? 變量
首先我們應(yīng)該說(shuō)明一下為什么計(jì)算機(jī)語(yǔ)言會(huì)需要變量,我們來(lái)看一個(gè)例子。假如你
現(xiàn)在要去買(mǎi)一臺(tái)電腦,假設(shè)我們知道這臺(tái)電腦的標(biāo)價(jià)是5000元,而現(xiàn)在恰逢國(guó)慶節(jié)打折,折扣率是10%,我們現(xiàn)在來(lái)計(jì)算這臺(tái)電腦的價(jià)格。一般情況下我們會(huì)這樣計(jì)算:首先我們要求出折扣了多少錢(qián)5000*10%=500元,然后我們只需要用5000-500就可以求出真實(shí)價(jià)格4500元。很顯然在這里又一個(gè)問(wèn)題:我們開(kāi)始算出來(lái)的500這個(gè)折扣額需要在后面使用,在日常生活中,我們可以把這個(gè)數(shù)寫(xiě)在紙上或記住,然后再做后面的運(yùn)算。那么對(duì)于計(jì)算機(jī)來(lái)說(shuō)需要怎么做才能完成任務(wù)呢,事實(shí)上,計(jì)算機(jī)會(huì)把這個(gè)值記在內(nèi)存里,以便進(jìn)行下面的運(yùn)算,這就用到了變量。什么是變量?變量就是程序語(yǔ)言中存儲(chǔ)數(shù)據(jù)的基本單元。
??????計(jì)算機(jī)操作如下:
1.?????? 首先定義變量存儲(chǔ)電腦價(jià)格5000。
2.?????? 執(zhí)行價(jià)格*10%求出折扣額。
3.?????? 將折扣額這個(gè)中間結(jié)果存入變量。
4.?????? 將價(jià)格與折扣額相減。
5.?????? 將真是的價(jià)格存入結(jié)果變量。
顯而易見(jiàn),變量對(duì)應(yīng)一塊能存東西的內(nèi)存單元。程序語(yǔ)言通常使用變量來(lái)存儲(chǔ)數(shù)據(jù),使用變量可以引用存儲(chǔ)在內(nèi)存中的數(shù)據(jù),并隨時(shí)根據(jù)需要顯示數(shù)據(jù)或修改數(shù)據(jù)。另外如前所述,變量是有類(lèi)型的,不同類(lèi)型的變量可以存儲(chǔ)不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。數(shù)據(jù)類(lèi)型的概念我們稍后再說(shuō),下面來(lái)看一下C#中變量定義的語(yǔ)法:
數(shù)據(jù)類(lèi)型 名?? 變量名
或
數(shù)據(jù)類(lèi)型名? 變量名=初始值
比如我們可以定義整型的年齡變量:
int?age=20;
上面我們定義了一個(gè)整型的變量age,并且讓這個(gè)變量的初始值為20。當(dāng)你定義一個(gè)變量后,系統(tǒng)會(huì)根據(jù)此變量的數(shù)據(jù)類(lèi)型為這個(gè)變量分配一塊存儲(chǔ)數(shù)據(jù)的內(nèi)存,此后可以通過(guò)變量名來(lái)引用這個(gè)變量(就好比人名可以引用某個(gè)人一樣)。
?
2.2.1?? 簡(jiǎn)單類(lèi)型
變量中,簡(jiǎn)單類(lèi)型實(shí)際上就是值類(lèi)型,值類(lèi)型的數(shù)據(jù)類(lèi)型基本上可以歸納為三類(lèi):
第一類(lèi)是整數(shù)型,包括int,long等,他們都可以定義整數(shù)變量。第二類(lèi)是浮點(diǎn)型,它們包括float,double等,他們可以定義小數(shù)類(lèi)型的變量。第三類(lèi)是字符型和布爾型,包括char,bool等類(lèi)型,他們可以定義字符串或者邏輯類(lèi)型的變量。
???????整數(shù)類(lèi)型的常用類(lèi)型有(如下表):
| 名????? 稱(chēng) | 符號(hào) | 大小(字節(jié)) | 范????? 圍 |
| 字節(jié)類(lèi)型 | sbyte | 1 | -128到127 |
| 無(wú)符號(hào)字節(jié)類(lèi)型 | byte | 1 | 0到255 |
| 整型 | int | 4 | -2147483648到2147483647 |
| 無(wú)符號(hào)整型 | uint | 4 | 0到4294967295 |
| 短整型 | short | 2 | -32768到32767 |
| 無(wú)符號(hào)短整型 | ushort | 2 | 0到65535 |
| 長(zhǎng)整型 | long | 8 | -9223372036854775808到9223372036854775807 |
| 無(wú)符號(hào)長(zhǎng)整型 | ulong | 8 | 0到18446744073709551615 |
????? 整數(shù)型也叫整形,是最常用的數(shù)據(jù)類(lèi)型。使用整數(shù)定義的變量只能存儲(chǔ)整型的數(shù)字,各種整型變量對(duì)應(yīng)的內(nèi)存參照表中的“大小”一欄,變量能保存的數(shù)值范圍參照表中“范圍”一欄。我們可以用整型定義人的年齡,國(guó)家的人口,日期的天數(shù)以及商品的數(shù)量等。
????? 你可能會(huì)用疑問(wèn),不就是一個(gè)整數(shù)么,為什么整數(shù)需要這么多數(shù)據(jù)類(lèi)型,而且你會(huì)發(fā)現(xiàn)每一種數(shù)據(jù)類(lèi)型都有無(wú)符號(hào)和有符號(hào)兩種。實(shí)際上,不管是int還是byte,不管是有符號(hào)還是無(wú)符號(hào),都是為了更精確的說(shuō)明和體現(xiàn)變量的真正含義,比如你定義天數(shù)最好使用ushort,因?yàn)樘鞌?shù)沒(méi)有負(fù)數(shù)并且天數(shù)的范圍剛好適合ushort,一旦你這樣定義了,那么如果給天數(shù)一個(gè)負(fù)數(shù)或者給天數(shù)一個(gè)特大的數(shù),編譯器將提示你這個(gè)數(shù)字不合法。這就可以初步保證正確的使用該變量。
??????整數(shù)型就先介紹到這里,下面我們來(lái)看常用的浮點(diǎn)型(如下表):
| 名????? 稱(chēng) | 符號(hào) | 大小(字節(jié)) | 范????? 圍 |
| 浮點(diǎn)型 | float | 4 | +- |
| 雙精度浮點(diǎn)型 | double | 8 | ? |
| 高精度浮點(diǎn)型 | decimal | 16 | ? |
??????? 浮點(diǎn)型可以表示小數(shù)或整數(shù)值,也因此浮點(diǎn)型的變量可以保存整數(shù)和小數(shù)兩種數(shù)字。雖然說(shuō)浮點(diǎn)型也可以保存整數(shù)數(shù)字,但浮點(diǎn)型真正的用途是來(lái)表示有精度要求的小數(shù)。比如正弦值等。
??????? 各類(lèi)浮點(diǎn)型變量的內(nèi)存大小參照上表中“大小”一欄,通常越大的浮點(diǎn)型能保存的數(shù)值精度越高。
??????? 對(duì)于浮點(diǎn)型的數(shù)字通常要使用后綴來(lái)指明其數(shù)據(jù)類(lèi)型。對(duì)于decimal類(lèi)型的數(shù)字要使用后綴m或M;對(duì)于float類(lèi)型的數(shù)字要使用后綴f或F;對(duì)于double類(lèi)型的數(shù)字要使用后綴df或D,如20.4d等。這里要注意:如果一個(gè)小數(shù)沒(méi)有使用后綴,那么此小數(shù)數(shù)值默認(rèn)情況下是double類(lèi)型。如果你將一個(gè)double類(lèi)型的數(shù)值給一個(gè)float變量就會(huì)發(fā)生類(lèi)型不匹配的錯(cuò)誤,如:
float? m=2.2;
“2.2”默認(rèn)為double型,要給浮點(diǎn)型變量賦值應(yīng)該為:
float? m=2.2f;
上面介紹了整數(shù)型和浮點(diǎn)型,最好我們來(lái)看字符型和布爾型(如下表):
| 名????? 稱(chēng) | 符號(hào) | 大小(字節(jié)) | 范????? 圍 |
| 字符型 | char | ?? ?????2 | 16位 Unicode 字符 |
| 布爾型 | bool | ??????? 1 | true 和false |
字符型變量用于保存和表示世界上已知書(shū)面語(yǔ)言中的一個(gè)字符。對(duì)于C#中的字符
型,熟悉C/C++語(yǔ)言的朋友要特別注意,在C/C++語(yǔ)言中char型大小為一個(gè)字節(jié),只能表示一個(gè)英文字符,而C#中字符型有兩個(gè)字節(jié),可以表示世界上任何語(yǔ)言的字符。在C#中表示一個(gè)字符時(shí)應(yīng)該帶有單引號(hào),字符類(lèi)型變量的定義和使用方法如下:
???????? char enchar=’M’;
??????? char cnchar=’ 國(guó)’;
??????? 對(duì)于布爾型,它可以用來(lái)表示邏輯判斷的“真”和“假”。翻開(kāi)邏輯學(xué)相關(guān)的書(shū)籍你會(huì)找到“真”和“假”的含義,我們說(shuō),給一個(gè)命題比如“所有人是動(dòng)物“,如果這個(gè)命題成立,我們就認(rèn)為此命題返回的結(jié)果為“真”,反之返回的結(jié)果為“假”。邏輯學(xué)中使用真和假來(lái)表示邏輯判斷的結(jié)果,C#語(yǔ)言使用ture和false兩個(gè)值來(lái)表示邏輯判斷的真和假,這是C#語(yǔ)法。布爾型變量定義和使用方法如下:
????????? bool?? trbool=true;
????????? bool?? fsbool=false;
????????? bool??? mybool=x>y;
?????? 到現(xiàn)在為止,我們介紹完了C#中所有值類(lèi)型的數(shù)據(jù)類(lèi)型。最后我們來(lái)看一下值類(lèi)型的一個(gè)綜合示例:
?
using System;namespace myText{Class Text{static void Main(string[] args){int cx=10,cy=12,cr=0;cr=cx*cy;Console.WriteLine(“長(zhǎng)方形的長(zhǎng)是:{0},寬是:{1}”,cx,cy);Console.WriteLine(“長(zhǎng)方形的面積是:{0}”,cr);double sx=12,sy=10.5;Console.WriteLine(“三角形的底是:{0},高是:{1}”,sx,sy);Console.WriteLine(“三角形的面積是:{0}”,sx*sy/2);char sx=’C’,sy=’N’;Console.WriteLine(“{0}{1}表示中國(guó)”,sx,sy);bool bh=cx>cy;Console.WriteLine(“{0}>{1}是{2}的”,cx,cy,bh);}}}?運(yùn)行結(jié)果:
長(zhǎng)方形的長(zhǎng)是:10,寬是:12
長(zhǎng)方形的面積是:120
三角形的底是:12,高是:10.5
三角形的面積是:63
CN表示中國(guó)
10>12是False的
上面的程序我們使用了剛才介紹的大部分?jǐn)?shù)據(jù)類(lèi)型。
?
2.2.2 變量的命名
變量在定義時(shí)涉及到數(shù)據(jù)類(lèi)型和變量名兩個(gè)元素,數(shù)據(jù)類(lèi)型是系統(tǒng)定義好的關(guān)鍵
字,而變量名是可以自己定義的。這里著重說(shuō)一下變量名的命名規(guī)則,變量名的命名主要有三條規(guī)則,變量名的構(gòu)成規(guī)則必須滿(mǎn)足下面條件:
l????????變量名可以由字母 數(shù)字 _(下劃線(xiàn))組合而成。
l????????變量名必須以字母或_(下劃線(xiàn))開(kāi)頭。
l????????C#語(yǔ)言中某些詞(如 int或 float等)稱(chēng)為保留字,具有特殊意義,不能用作變量名。
要注意的是,C#語(yǔ)言中變量名區(qū)分大小寫(xiě),因此變量age和Age是兩個(gè)不同的變
量。實(shí)際上,C#程序中有許多需要命名的對(duì)象,例如變量名,方法名,類(lèi)名等,為這些對(duì)象起一個(gè)名字來(lái)標(biāo)識(shí)這些對(duì)象,這些名字都稱(chēng)作標(biāo)識(shí)符,變量名就是變量標(biāo)識(shí)符。C#語(yǔ)言規(guī)定同一種標(biāo)識(shí)符不能重名,在這里也就說(shuō)變量名不能重名,這是變量定義時(shí)要注意的問(wèn)題。至此,我們可以來(lái)演練一下變量的定義了:
string? welcom=”歡迎進(jìn)入C#世界”;
int age=20;
double money=30000;
char c=’A’;
從上面的例子我們也可以看出,變量和數(shù)據(jù)類(lèi)型有著密切的關(guān)系,我們說(shuō)不同的變
量代表著不同的內(nèi)存存儲(chǔ)空間,并且這塊存儲(chǔ)空間是固定大小的,這樣就決定了變量有一定的存儲(chǔ)范圍,如果變量的值超出這個(gè)范圍就會(huì)發(fā)生錯(cuò)誤。而數(shù)據(jù)類(lèi)型就決定了變量占用內(nèi)存的大小,因此數(shù)據(jù)類(lèi)型對(duì)于變量來(lái)說(shuō)非常重要。
? 2.2.3 變量的聲明和賦值
????????? 學(xué)完變量的命名規(guī)則后,變量的聲明和賦值是非常簡(jiǎn)單的。變量在聲明的時(shí)候首先要知道所定義的變量是什么類(lèi)型的,在去聲明你所定義的變量;變量的賦值——變量可以在聲明的時(shí)候賦值,也可以聲明后在下面用到該變量時(shí)對(duì)其進(jìn)行賦值。下面我們來(lái)看下變量的聲明和賦值的示例:
???????? int???? age=20;//在聲明變量時(shí)直接給變量賦值
???????? 或
???????? int??? age;
???????? age =20;//先聲明變量,在對(duì)變量進(jìn)行賦值
??????? 總的來(lái)講,變量的聲明和賦值的語(yǔ)法是:
??????? 數(shù)據(jù)類(lèi)型????? 變量名;
????? ???變量名=初始值;
???????? 或
???????? 數(shù)據(jù)類(lèi)型???? 變量名=初始值;
?
?
|
上一節(jié)我們學(xué)習(xí)了變量,那么變量和變量之間怎么聯(lián)系起來(lái)呢?今天我們來(lái)學(xué)習(xí)運(yùn)算符和表達(dá)式。
在程序語(yǔ)言中,變量是字詞,通過(guò)運(yùn)算符將變量連接成表達(dá)式,表達(dá)式相當(dāng)于語(yǔ)言中的短句。運(yùn)算符最常見(jiàn)的就是加、減、乘、除,這些運(yùn)算符每一個(gè)小型的計(jì)算器都有。當(dāng)然程序語(yǔ)言支持的運(yùn)算符不止這些,每個(gè)程序語(yǔ)言提供的運(yùn)算符號(hào)稍有些不同,但大體上都一樣,在C#語(yǔ)言中主要有以下幾種運(yùn)算符:
★????算術(shù)運(yùn)算符
★????關(guān)系運(yùn)算符
★????邏輯運(yùn)算符
★????賦值運(yùn)算符
運(yùn)算符操作數(shù)的個(gè)數(shù),又可分為一元運(yùn)算符和二元運(yùn)算符,一元運(yùn)算符連接一個(gè)操作數(shù),二元運(yùn)算符連接兩個(gè)操作數(shù),我們常見(jiàn)的加、減、乘、除都是二元運(yùn)算符,他們需要連接兩個(gè)操作數(shù)。
運(yùn)算符連接操作數(shù)構(gòu)成表達(dá)式,操作數(shù)可以是變量和常數(shù)(單獨(dú)的一個(gè)數(shù)字或字符串等我們都可以稱(chēng)作常數(shù))。許多小的表達(dá)式可以構(gòu)成大的表達(dá)式。如“(x+y)+(x-y)”中間的加號(hào)連接兩個(gè)小的表達(dá)式構(gòu)成一個(gè)復(fù)雜的表達(dá)式,此時(shí)這些小表達(dá)式我們也可以認(rèn)為是操作數(shù),也就是說(shuō)操作數(shù)也可以是表達(dá)式。事實(shí)上C#中的表達(dá)式和小學(xué)數(shù)學(xué)中的算式有些相似。
★?? 2.3.1算術(shù)運(yùn)算符
下面我們首先來(lái)介紹算術(shù)運(yùn)算符,算術(shù)運(yùn)算符是我們最常見(jiàn)的運(yùn)算符,如下圖所示:
| 算術(shù)運(yùn)算符 | 作?? 用 | ???? 示?? 例 |
| ?????? + | ??? 加法操作 | ??? 1+2,x+y |
| ?????? - | ??? 減法操作 | ??? 2-1,x-y |
| ?????? * | ??? 乘法操作 | ??? 2*3,x*y |
| ?????? / | ??? 除法操作 | ??? 4、2,x/y |
| ?????? % | ??? 取余數(shù)操作 | 7%2=1,23%10=3 |
| ????? ++ | ??? 自增操作 | ? x++,++x |
| ????? -- | ??? 自減操作 | ? x--,--x |
算術(shù)運(yùn)算符用來(lái)連接操作數(shù)執(zhí)行算術(shù)運(yùn)算。其中前四種都很熟悉了。取余運(yùn)算又叫取模運(yùn)算,是用來(lái)取得余數(shù),比如我們要取得12除以5的余數(shù)可以使用“12%5”,結(jié)果是2.關(guān)于自增“++”和自減“--”運(yùn)算符的用法需要注意,我們可以用一種替代算法來(lái)解釋他們。如果“x++”或者“++x”單獨(dú)出現(xiàn)在一個(gè)語(yǔ)句中那么都相當(dāng)于“x=x+1”(注意:“x++”和“++x”在一定范圍下是有區(qū)別的),相對(duì)應(yīng)的自減也類(lèi)似。
關(guān)于算術(shù)操作符就介紹到這里,下面我們來(lái)看一個(gè)示例:
usingSystem;usingSystem.Text;namespaceText{class program{static void Main(string[] args){inta=5%2;doubleb=a+2*5/2.5;int x=5;inty=++x;intz=x++;Console.WriteLine(“a={0},b={1}”,a,b);Console.WriteLine(“x={0},y={1},z={2}”,x,y,z);}}}運(yùn)行結(jié)果:
a=1,b=5
x=7,y=6,z=6
?? 按F5鍵運(yùn)行后,運(yùn)行結(jié)果如上,這里重點(diǎn)要注意z和y的值。運(yùn)行結(jié)果中z和y都為6,你可以把上面的“++”符號(hào)換成“--”符號(hào)運(yùn)行,結(jié)果z和y都為4.有時(shí)我們也形象的稱(chēng)自增或自減變量“參與表達(dá)式運(yùn)算”為“使用”,如果遞增運(yùn)算符在變量的前面,那么變量先自我遞增然后在“使用”,在這里的“使用”是指“x賦值給y”。如果自增運(yùn)算符在變量后面,那么變量先“使用”再自我遞增。即“++x”是“先運(yùn)算后賦值“,“x++”是“先賦值后運(yùn)算”。
2.3.2關(guān)系運(yùn)算符
事實(shí)上,關(guān)系運(yùn)算符就是我們?cè)谛W(xué)三年級(jí)學(xué)過(guò)的的那些大于 小于 等于等。C#中關(guān)系運(yùn)算符用于測(cè)試兩個(gè)數(shù)或者兩個(gè)表達(dá)式之間的關(guān)系。關(guān)系運(yùn)算符連接操作數(shù)構(gòu)成關(guān)系表達(dá)式,關(guān)系表達(dá)式的計(jì)算結(jié)果為邏輯值true和false,如果此關(guān)系式表達(dá)成立則返回true,否則返回false。C#中的關(guān)系表達(dá)式大都是我們所熟悉的,如下表所示:
| 關(guān)系運(yùn)算符 | 作?? 用 | 示??? 例 |
| >? | 大于 | 3>2,x>y |
| <? | 小于 | 2<3,y<x |
| >= | 大于等于 | 3>=3,x>=y |
| <= | 小于等于 | 2<=3,y<=x |
| == | 等于 | 2==3,x==y |
| != | 不等于 | 2!=3,x!=y |
關(guān)系表達(dá)式得到的結(jié)果是邏輯值“真”和“假”。我們?cè)谇懊嫣岬竭^(guò),在C#中“真”和“假”使用布爾類(lèi)型來(lái)表示,“真”用小寫(xiě)true來(lái)表示,“假”用小寫(xiě)false來(lái)表示,它們描述了表達(dá)式所表達(dá)的關(guān)系是否成立,如下所示:
boolr=3>4;?? //關(guān)系不成立則r為false
boolr=3>2;?? // 關(guān)系成立則r為true
關(guān)系表達(dá)式也有一些很復(fù)雜的,比如“(a+b)>(a-b)”等復(fù)合表達(dá)式,關(guān)系表達(dá)式主要用在條件判斷語(yǔ)句中(如if語(yǔ)句等,我們后面將會(huì)介紹),表示如果某個(gè)條件成立就去執(zhí)行一個(gè)操作,如:
using System;using System.Text;namespace Text{class Program{static void Main(string[] args){int a=1,b=2;if(a<b){Console.WriteLine(“a小于b”);}}}}運(yùn)行結(jié)果:
a小于b
?
2.3.3邏輯運(yùn)算符
邏輯運(yùn)算符通常連接關(guān)系表達(dá)式從而表示更復(fù)雜的關(guān)系。一般來(lái)說(shuō),邏輯運(yùn)算符通常使用在if語(yǔ)句中連接一個(gè)或多個(gè)條件構(gòu)成符合條件。要注意的是,邏輯運(yùn)算符連接成的表達(dá)式還是關(guān)系表達(dá)式,返回值的類(lèi)型也是布爾型,下表是C#中用到的邏輯運(yùn)算符。
| 邏輯運(yùn)算符 | 作? 用 | 描? 述 |
| && | 邏輯“與”操作 | “并且”的意思 |
| || | 邏輯“或”操作 | “或者”的意思 |
| ! | 邏輯“非”操作 | “不”或“非”的意思 |
在日常生活中經(jīng)常出現(xiàn)復(fù)雜的條件選擇,不如下面這個(gè)例子:
“假如我有錢(qián)或者我長(zhǎng)得帥,那么我可以找個(gè)漂亮的女朋友。”
這里的“我有錢(qián)”和“我長(zhǎng)得帥”兩個(gè)條件之間的“或者”就相當(dāng)于使用了邏輯運(yùn)算符“||”,我們?cè)倥e一個(gè)C#中的例子:
if(a>b?&&? a!=0)?? r=b/a;
這個(gè)式子意思是:假如a大于b并且a不為零,那么求b除以a的結(jié)果。
邏輯“非”相當(dāng)于“不”,會(huì)對(duì)原來(lái)的值取反,比如:
“他不是個(gè)好人”就等效于“他!=好人”。
“他不不是個(gè)好人”就等效于“他!!好人”。
兩個(gè)“非”運(yùn)算符可以省略掉所以任何邏輯表達(dá)式不會(huì)同時(shí)出現(xiàn)兩個(gè)并列的“非”符號(hào),那是很無(wú)聊的寫(xiě)法。你可以簡(jiǎn)單的將邏輯運(yùn)算符“&&”理解為“并且”,將 “||”理解為“或者”,“!”理解為“不”,這樣有助于你對(duì)代碼的理解。下表列舉了所有邏輯運(yùn)算符在各種各種運(yùn)算情況下的結(jié)果,仔細(xì)觀察會(huì)發(fā)現(xiàn)里面是有規(guī)律的:
| 運(yùn)? 算 | 結(jié)? 果 | 運(yùn)? 算 | 結(jié)? 果 |
| !true | false | false && false | false |
| !false | true | true || true | true |
| true && true | true | true || false | true |
| true && false | false | false || false | false |
通過(guò)上面的表我們可以得出結(jié)論:
●????對(duì)于 && 操作,只有當(dāng)兩個(gè)條件都為true時(shí)結(jié)果才為true。
●????對(duì)于 || 操作,只要任何一個(gè)條件為true則結(jié)果為true。
示例:
using System;namespace Text{class Program{static void Main(string[] args){floatprice1=27.3f; //第一種商品的價(jià)格floatprice2=57.0f; //第二種商品的價(jià)格int n1=2; //第一種商品的數(shù)量int n2=3; //第二種商品的數(shù)量floatdiscount=0.2f; //折扣//總消費(fèi)金額doubletotal=price1 * n1 + price2 * n2;//如果總消費(fèi)額大于200或者買(mǎi)的每種商品的價(jià)格都超過(guò)了100則打折if(total>200||(price1>100&& price2>100)){total=total*(1-discount);Console.WriteLine(“折后總消費(fèi)額為:{0}”,total);}elseConsole.WriteLine(“總消費(fèi)額為:{0}”,total);}}}運(yùn)行結(jié)果為:
折后總消費(fèi)額為:180.4799
上面的例子我們首先定義了兩個(gè)價(jià)格和兩個(gè)數(shù)量變量。價(jià)格變量定義成浮點(diǎn)型時(shí)因
為價(jià)格很可能存在小數(shù),數(shù)量定義成整型是因?yàn)閿?shù)量只能時(shí)整數(shù)。然后我們使用算術(shù)表達(dá)式求出所有的購(gòu)買(mǎi)商品的總額,并保存到total變量中,total變量采用double類(lèi)型只是為了演示double的用法,實(shí)際上用float型也可以。最后我們使用if語(yǔ)句根據(jù)條件來(lái)執(zhí)行不同的代碼塊,假如if語(yǔ)句后面的括號(hào)中關(guān)系表達(dá)式返回true,則執(zhí)行折扣計(jì)算相關(guān)代碼,如果返回false則不計(jì)算折扣直接顯示消費(fèi)總額。
下面來(lái)看一個(gè)綜合性的示例,猜猜它的運(yùn)行結(jié)果?
class Person{static void Main(){char cSex='男'; //性別int iHeight=175; //身高float fWeight=65.55f; //體重,float型需要加fbool bIsMarriage=false; //婚否,取值:true(表示已婚);false(未婚)string sName; //字符串類(lèi)型sName="張秋楓";System.Console.WriteLine("***************************");//"":字符串System.Console.WriteLine(cSex);System.Console.WriteLine(iHeight);System.Console.WriteLine(fWeight);System.Console.WriteLine(bIsMarriage);System.Console.WriteLine(sName);System.Console.WriteLine("********************************");}}2.3.4賦值運(yùn)算符
賦值運(yùn)算符是給一個(gè)變量賦一個(gè)值,聽(tīng)起來(lái)像廢話(huà),實(shí)際上這個(gè)小小的賦值作用非
常大,她會(huì)指示系統(tǒng)向變量對(duì)應(yīng)的內(nèi)存存入一個(gè)值。賦值運(yùn)算符就是我們前面見(jiàn)到的“x=2”表達(dá)式中間的那個(gè)等于號(hào)。這里要注意賦值符號(hào)和“等于”號(hào)的區(qū)別,賦值運(yùn)算符是一個(gè)“=”號(hào),而兩個(gè)“==”號(hào)才是我們前面介紹的的關(guān)系運(yùn)算中表示相等關(guān)系的“等于”號(hào)。除了基本的賦值符號(hào)外,C#中還支持復(fù)合賦值運(yùn)算符號(hào)。下表中左邊一列是復(fù)合賦值運(yùn)算符,中間一列是示例,右邊一列是與左邊運(yùn)算符等效的運(yùn)算:
| 賦值運(yùn)算符 | 示? 例 | 描? 述 |
| = | x=2 | 給x賦值2 |
| += | x+=2 | 相當(dāng)于x=x+2 |
| - | x-=2 | 相當(dāng)于x=x-2 |
| /= | x/=2 | 相當(dāng)于x=x/2 |
| *= | x*=2 | 相當(dāng)于x=x*2 |
| %= | x%=2 | 相當(dāng)于x=%22 |
表中那些復(fù)合賦值運(yùn)算符實(shí)際上就是后面描述部分的一個(gè)縮寫(xiě)形式,只不過(guò)那種省略的寫(xiě)法執(zhí)行效率比較高,這是從C語(yǔ)言繼承下來(lái)的特性,所以提倡使用前面的那種省略的寫(xiě)法。賦值運(yùn)算符的計(jì)算執(zhí)行是從右往左進(jìn)行,比如我們常見(jiàn)的“x=x+2”,實(shí)際上是先計(jì)算了“x+2”然后再把這個(gè)結(jié)果給x,所以運(yùn)算結(jié)果后x會(huì)增加2,如果出現(xiàn)連寫(xiě)的賦值運(yùn)算,則計(jì)算是從右往左逐個(gè)賦值,如:“x=y=a”,則結(jié)果x y都等于a,下面是一個(gè)經(jīng)典的交換兩個(gè)數(shù)的算法:
int a=1,b=2;
b=(a+b)-(a=b);
一句話(huà)執(zhí)行完后a、b的值將互換,a變?yōu)?,b變?yōu)?。計(jì)算首先從右邊開(kāi)始,先計(jì)算左邊括號(hào)里面的“a+b”,結(jié)果為3,然后計(jì)算右邊括號(hào)里面的值,右邊括號(hào)里面的值計(jì)算完后結(jié)果為2,同時(shí)a已經(jīng)等于了2。最后,左邊括號(hào)里面的結(jié)果3減去右邊括號(hào)里面的結(jié)果2得到結(jié)果1,這個(gè)1賦值給b,那么b就是1了,交換完畢。從上面的例子我們不難看出,系統(tǒng)運(yùn)算的每一步在內(nèi)存中都會(huì)暫存結(jié)果。上面的兩個(gè)括號(hào)的結(jié)果先計(jì)算完,然后再把這兩個(gè)結(jié)果進(jìn)行相減,最后將減的結(jié)果進(jìn)行賦值。
C#示例:
using System;namespace MyText{class Text{static void Main(string[]args){int num=4567;int thousand,hundred,ten,indiv;thousand=num/1000;num%=1000;hundred=num/100;num%=100;ten=num/10;indiv=num%10;num=indiv * 1000+te n*100+hundred * 10+thousand;Console.WriteLine(“反轉(zhuǎn)后的數(shù)是:{0}”,num);}}}運(yùn)算結(jié)果:
反轉(zhuǎn)后的數(shù)是:7654
注意:賦值運(yùn)算右邊表達(dá)式的值必須和被賦值對(duì)象數(shù)據(jù)類(lèi)型相同,如:
int a=3.3f;
float b=‘a(chǎn)’;
上面的第一個(gè)表達(dá)式右邊是浮點(diǎn)型數(shù)字而左邊是整型的變量,這樣是不對(duì)的。同樣第二條語(yǔ)句右邊是字符,左邊是浮點(diǎn)型的變量,這樣賦值也是不合理的。如果賦值運(yùn)算兩邊是引用類(lèi)型,那么類(lèi)型也必須兼容。一般來(lái)說(shuō),你完全可以把變量當(dāng)作是一個(gè)特定的容器,比如裝番茄醬的瓶子,對(duì)此你不能將辣椒醬裝在里面,在進(jìn)行賦值操作時(shí)要特別注意這一點(diǎn)。當(dāng)然后面我們會(huì)介紹數(shù)據(jù)類(lèi)型轉(zhuǎn)換的相關(guān)知識(shí),有了數(shù)據(jù)類(lèi)型的轉(zhuǎn)換你就可以把辣椒醬裝到番茄醬瓶子里了,你就可以把浮點(diǎn)型賦值給整型了。
2.3.5 運(yùn)算符的優(yōu)先級(jí)
現(xiàn)在,你幾乎已經(jīng)了解所有的運(yùn)算符,是你大顯身手的時(shí)候了,那么你能計(jì)算下面的式子嗎: r=(2-1)* 3 + !2 – 5% 2 * 2? && 3;
你如果沒(méi)有接觸過(guò)其他程序語(yǔ)言,相信你應(yīng)該傻眼兒了,這么多運(yùn)算符應(yīng)該先算哪個(gè)呢?我們?cè)谛W(xué)時(shí)就知道運(yùn)算符有優(yōu)先級(jí),我們知道乘法和除法的優(yōu)先級(jí)高于減法運(yùn)算,而括號(hào)的優(yōu)先級(jí)最高,一個(gè)式子既有加減又有乘除還有括號(hào),那么計(jì)算的順序是:括號(hào)里面的—>乘除-->加減,如“3*4+2/(5+2+1)”式子,結(jié)果是:“12.25”。我們知道C#中的運(yùn)算符遠(yuǎn)比數(shù)學(xué)中的運(yùn)算符多,而且這些運(yùn)算符都可以出現(xiàn)在同一個(gè)表達(dá)式中,那么我們的優(yōu)先級(jí)是怎樣的呢?
C#中運(yùn)算符優(yōu)先級(jí)從高到低排列如下表所示:
| 運(yùn)算符號(hào) | 結(jié)合性 | 描述 | 運(yùn)算符號(hào) | 結(jié)合性 | 描述 |
| () | 從左到右 | 括號(hào)優(yōu)先級(jí)最高 | =,!= | 從左到右 | 等號(hào),不等號(hào) |
| ++,--,! | 從右到左 | 遞增,遞減,邏輯非運(yùn)算符 | && | 從左到右 | 邏輯 與 |
| *,/,% | 從左到右 | 乘,除,取模操作 | || | 從左到右 | 邏輯 或 |
| +,- | 從左到右 | 加 減運(yùn)算 | =,+=,*=,/=,%=,-= | 從左到右 | 賦值運(yùn)算符和復(fù)合賦值運(yùn)算符 |
| <,<=,>,>= | 從左到右 | 小于 小于等于 大于 大于等于 | ? | ? | ? |
運(yùn)算符的結(jié)合性是指同時(shí)出現(xiàn)多個(gè)該運(yùn)算符時(shí)的計(jì)算方向。比如優(yōu)先級(jí)最高的括號(hào),如果在一個(gè)表達(dá)式中出現(xiàn)多個(gè)括號(hào),那么將從左向右依次計(jì)算這些括號(hào)里面的內(nèi)容。再比如大于小于號(hào),如果幾個(gè)大于 小于號(hào)連接在一起,那么是從左到右進(jìn)行計(jì)算的。通常,能接兩個(gè)操作數(shù)的運(yùn)算符稱(chēng)作二元運(yùn)算符,比如“+”號(hào),接一個(gè)操作數(shù)的我們稱(chēng)作一元運(yùn)算符,比如“!”和“++”等。從上面的優(yōu)先級(jí)例子可以看出,除了括號(hào)外,一元運(yùn)算符的優(yōu)先級(jí)最高。除此之外,從大的范圍來(lái)講算術(shù)運(yùn)算符的優(yōu)先級(jí)高于關(guān)系運(yùn)算符,關(guān)系運(yùn)算符的優(yōu)先級(jí)高于邏輯運(yùn)算符,優(yōu)先級(jí)最低的是賦值運(yùn)算符。
示例:
using System;namespace Text{class Program{static void Main(string[] args){int y=2002;if(y % 4 == 0 && y % 100!=0 ||y % 400== 0)Console.WriteLine(”{0}年是閏年”,y);elseConsole.WriteLine(”{0}年不是閏年”,y);}}}上面是一個(gè)求閏年的算法。假如某年能被400整除那么這年是閏年,如果某年不能被100整除并且能被4整除,那么這年也是閏年,也就是說(shuō)這兩個(gè)條件滿(mǎn)足其中的一個(gè)就是閏年。上面的if語(yǔ)句中優(yōu)先級(jí)最高的運(yùn)算符是“%”號(hào),所有的“%”計(jì)算完了再計(jì)算“==”號(hào),然后計(jì)算“&&”號(hào),最后計(jì)算“||”號(hào),最終結(jié)果false,所以2002年不是閏年。這里注意的是,上面的式子不夠好,雖然實(shí)現(xiàn)了功能,但看起來(lái)令人頭暈,所以我們提倡多用括號(hào),善于用括號(hào),上面的式子應(yīng)改為:
If((y % 4 == 0 && y % 100!=0) ||(y %400 == 0))
很顯然加了括號(hào)的式子含義明了,代碼工整,直觀易懂。這屬于代碼規(guī)范的范疇。多種運(yùn)算符同時(shí)出現(xiàn)的地方不是什么算術(shù)表達(dá)式,而是像上面那樣的條件表達(dá)式中。計(jì)算運(yùn)算符的優(yōu)先級(jí)是件頭痛的事,加上括號(hào)后會(huì)使問(wèn)題變得簡(jiǎn)單化。
另外,在上面使用運(yùn)算符號(hào)時(shí)你可能也注意到了一個(gè)問(wèn)題,這個(gè)問(wèn)題原不屬于運(yùn)算符的優(yōu)先級(jí)的問(wèn)題,是關(guān)于長(zhǎng)表達(dá)式跟數(shù)據(jù)類(lèi)型有關(guān)的問(wèn)題。問(wèn)題是如果這個(gè)表達(dá)式中存在各種數(shù)據(jù)類(lèi)型的數(shù)值怎么辦,如下面的式子:
double r=1 + 1/2 + 2.0;
上面式子中r的值為3而不是3.5。對(duì)于混合數(shù)據(jù)類(lèi)型表達(dá)式的計(jì)算,結(jié)果按照最高精度為準(zhǔn),超過(guò)精度的一概被“切”掉,比如“1/2”結(jié)果是0,本來(lái)計(jì)算的結(jié)果是0.5,但大家都是整型所以結(jié)果是整型,小數(shù)點(diǎn)后數(shù)字都被“切”掉了。如果將“1/2”變成“1/2.0”,那么結(jié)果就是0.5,因?yàn)?.0是浮點(diǎn)型,所以結(jié)果也是浮點(diǎn)型。長(zhǎng)表達(dá)式無(wú)非就是許多小表達(dá)式組合計(jì)算的結(jié)果,比如上面那個(gè)式子,首先計(jì)算“1/2”結(jié)果是0,然后計(jì)算“1+0+2.0”,結(jié)果是double類(lèi)型的3.0。
關(guān)于運(yùn)算符和表達(dá)式的內(nèi)容我們就介紹到這里,要特別注意的是:運(yùn)算符的優(yōu)先級(jí)以及混合數(shù)據(jù)類(lèi)型表達(dá)式的計(jì)算問(wèn)題。
|
選擇題:
1.????? 下列變量的聲明正確的是()
A.int???1name;
B.int????_name;
C.int???? float;
2.?? 下面
問(wèn)答題:
1.????? 本章中學(xué)了幾種運(yùn)算符?他們的優(yōu)先級(jí)從高到低的順序是什么?
?
|
在本章中,我們主要學(xué)習(xí)了:
u??????C#的基本語(yǔ)法
u??????變量的簡(jiǎn)單類(lèi)型
u??????變量的命名規(guī)則
u??????運(yùn)算符和表達(dá)式
u??????運(yùn)算符的優(yōu)先級(jí)
| 練習(xí)項(xiàng)目: |
?
學(xué)過(guò)變量和表達(dá)式,請(qǐng)大家發(fā)揮自己的想象,做一個(gè)和本章緊密相連的項(xiàng)目:
需達(dá)到效果如下:
???? 在這個(gè)項(xiàng)目中,每種運(yùn)算符至少用一個(gè)說(shuō)明你掌握了此類(lèi)運(yùn)算符;運(yùn)算中要考慮運(yùn)算符的優(yōu)先級(jí);聲明的變量類(lèi)型要恰當(dāng)。
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/mjsn/p/6150983.html
總結(jié)
以上是生活随笔為你收集整理的C#OOP之二 变量和表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用vue-CLI构建vue工程项目
- 下一篇: Mysql:替换某个字段中的部分字符串—