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