第2章 C#語法基礎
C#是Visual Studio提供的主要編程語言之一,它是一種完全面向對象的、可視化的程序設計語言。掌握C#語言的代碼結構、語法規則、數據類型及轉換、表達式類型等最基本的語法知識是完成復雜代碼編寫、實現程序功能的基礎。
2.1 C#變量
對用戶來說,變量是用來描述一條信息的名稱,在變量中可以存儲各種類型的信息。而對計算機來說,變量代表一個存儲地址,變量的類型決定了存儲在變量中的數據的類型。簡單地講,變量就是在程序運行過程中其值可以改變的數據。程序是通過變量的名稱來訪問相應內存空間的。
在程序設計中,使用變量進行數據傳遞、數據讀寫等是最為基礎的操作,正確理解和使用變量是程序設計工作的重要技術之一。
2.1.1 變量的命名規范
為使程序都符合相同的規范,保證一致性和統一性,要求程序必須遵守編碼規范,主要內容有:代碼規范、注釋規范、變量命名規范、常量命名規范、類命名規范、接口命名規范、方法命名規范、文件名命名規范和程序版本號命名規范等。本節主要介紹變量的命名規范。
1.變量命名的基本原則
變量命名的基本原則如下。
1)變量名的首字符應是英文字母、下畫線或符號@。
2)變量名中不能包含空格、小數點及各種符號。
3)組成變量名的字符數不要太長,應控制在3~20個字符。
4)變量名不能是C#的關鍵字(已被C#占用并賦予特定含義的字符串),如int、object和string等不能用作變量名。
5)變量名在同一范圍內必須是唯一的。
2.為變量命名時的注意事項
在為變量命名時應注意以下幾點。
1)變量名應該能夠標識事物的特性,如用于存放用戶名的字符串變量可使用username命名。
2)變量名應使用英文單詞,盡量不要使用漢語拼音或漢字。此外,還應注意C#中的變量是區分大小寫的,如變量Age和變量age將被認為是兩個不同的變量。
3)變量名盡量不使用縮寫,除非它能較好地表達變量數據的含義。
4)一般情況下,內存變量可使用小寫單詞組合。例如,bool ispass(聲明一個名為ispass的、bool類型的內存變量)。類、對象及其屬性和方法則應使用首字母大寫的方式以示區別。例如,Student.Name(Student表示一個類,Name為類的一個屬性)、PubClass.CheckUser()(PubClass表示一個類,CheckUser()表示類的一個方法)等。
3.常用的變量命名約定
在.NET Framework名稱空間中有兩種命名約定,即Pascal命名法和Camel(駝峰)命名法。它們都應用在由多個單詞組成的名稱中。
1)Pascal命名法是Pascal語言中使用的一種命名方法,組成變量名的每個單詞的首字母大寫,其他字母均小寫,如Age、NameFirst、DateStart和WinterOfDiscontent等。
2)Camel命名法與Pascal命名法基本相同,區別是變量名的第一個單詞的首字母為小寫,以后的每個單詞都以大寫字母開頭,如age、nameFirst、timeOfDeath和myNumber等。
Microsoft建議,對于簡單的變量,使用Camel規則,而對于比較復雜的命名則使用Pascal規則。
2.1.2 聲明變量
變量總是和變量名聯系在一起的,所以要使用變量,必須為變量命名。在C#中,命名變量的過程稱為“聲明”。
聲明變量就是把存放數據的類型告訴程序,以便為其安排需要的內存空間。變量的數據類型可以對應所有基本數據類型。聲明變量最簡單的格式為
數據類型名稱 變量名列表;
舉例如下。
float result; //聲明一個單精度浮點型變量
bool usersex; //聲明一個布爾型變量
decimal salary; //聲明一個用于存放“工資”值的十進制變量
string username,useremail; //聲明兩個字符串型變量,變量名之間要使用逗號將其分隔開
語句是程序的基本組成,使用C#編寫的程序的每條語句均以一個分號結束,一條語句可以書寫在一行或多行中。
需要注意的是,C#使用的變量必須“先聲明,后使用”。直接使用沒有進行類型和名稱聲明的變量時,將出現未找到變量的錯誤。為了盡量避免這類錯誤,Visual Studio會將已聲明的變量添加到智能感知提示選擇列表中。
對于較長或拼寫復雜的變量名,最好先輸入首字母或前面若干個字母,再用上下光標鍵從供選列表中選擇需要的名稱,最后使用“.”號、空格鍵或〈Enter〉鍵將其輸入,這樣可以有效避免拼寫錯誤。
2.1.3 給變量賦值
一個變量只有在被賦予某數據(值)后,才有實際意義。為變量賦值需要使用賦值號“=”。
1.賦值表達式
C#的賦值表達式由變量、賦值號和值表達式組成,變量總是出現在賦值號的左邊。舉例如下。
int num;
num=32; //為整型變量num賦值32
bool usersex=true; //聲明布爾型變量usersex的同時賦值為true
給字符和字符串變量賦值,舉例如下。
char letter; //聲明一個字符型變量(字符型變量只能存放一個字符,不同于字符串型)
letter='w';
string uname="張三"; //聲明字符串變量uname的同時為其賦值“張三”
2.使用變量為變量賦值
C#的賦值表達式中的值表達式可以是另一個變量,舉例如下。
bool db_open,db_close;
db_open=true;
db_close=db_open; //將變量db_open的值賦給同類型變量db_close
//將文本框控件textBox1中Text屬性值(文本框中的文本)保存到字符串變量uname中
string uname=textBox1.Text;
3.同時為多個變量賦值
可以同時為幾個變量賦以相同的值,舉例如下。
int num1,num2,num3;
num1=num2=num3=7;
需要說明的是,賦值號“=”與數學中的等號具有相同的外觀,但它們的含義是完全不同的。例如,在數學中x=12與12=x均正確,但在賦值語句中x=12是正確的,而12=x就是錯誤的,因為語法格式要求變量只能出現在賦值表達式的左邊。
2.1.4 變量的作用域
在面向對象的程序設計中,變量的作用域(有效范圍)是一定的。在聲明變量時可使用訪問修飾符來對變量進行訪問控制。C#中常用的訪問修飾符及說明如表2-1所示。
表2-1 常用訪問修飾符及指定的變量作用域
除了使用訪問修飾符外,在程序不同位置聲明的變量,其含義及作用域也是不同的。常用的有靜態變量、實例變量和局部變量等概念。舉例如下。
其中,x為靜態變量,y為實例變量,i是局部變量。
1)靜態變量:指使用static修飾符聲明的變量,它只需創建一次,在后面的程序中可以多次引用。若類中的一個成員變量被聲明為靜態的,則類中的所有成員都可以共享這個變量。
2)實例變量:指未用static修飾符聲明的變量,如上述代碼中的y。實例變量的作用域為從某個類的實例被創建,一直到該實例從內存中被釋放。
3)局部變量:指在一個獨立的程序塊中聲明的變量,如上述代碼中的i。局部變量只在聲明它的程序塊中有效,一旦程序離開這個范圍局部變量立即失效。在if、switch、for和while等塊結構語句中聲明的變量都是局部變量。
2.2 數據類型及類型轉換
程序在處理數據時,需要對數據進行臨時保存,而保存不同類型的數據所用的存儲空間是不同的,所以掌握各種數據類型及其轉換方法是十分重要的。
根據數據的性質不同,可以將其分為數值型數據、字符型數據、日期時間型數據、邏輯型數據和對象型數據等。在程序設計過程中,除了需要理解各種類型的數據特點外,還需要掌握常用數據類型之間的轉換,以便對數據進行存儲、輸出或加工等操作。
2.2.1 數值類型
數值類型有整數類型與實數類型兩種,沒有小數位的為整數類型,帶小數位的為實數類型。
1.整數類型
整數類型又分為有符號整數與無符號整數。有符號整數可以帶正負號,無符號整數不需帶正負號,默認為正數。
有符號整數包括sbyte(符號字節型)、short(短整型)、int(整型)和long(長整型)。
無符號整數包括byte(字節型)、ushort(無符號短整型)、uint(無符號整型)和ulong(無符號長整型)。
需要注意的是,不同的整數類型表示的數值范圍不同,這為程序設計中根據實際需要進行靈活選擇提供了方便,同時設置適當的類型對節約系統資源、提高程序運行效率也是十分重要的。
常用整數類型、占用的存儲空間及取值范圍如表2-2所示。
表2-2 整數類型及說明
2.實數類型
實數類型主要包括float(單精度浮點型)、double(雙精度浮點型)和decimal(十進制型)。
常用實數類型占用的存儲空間及取值范圍如表2-3所示。
表2-3 實數類型及說明
float型數據可表示的精度為7位;double型數據可表示的精度為15位或16位;decimal型數據可以表示28位或29位有效數字,特別適合財務和貨幣計算時使用。
2.2.2 字符類型
字符型數據包括單個字符類型與多個字符(字符串)類型。
1.Unicode字符集
Unicode是一種重要的通用字符編碼標準,它覆蓋了美國、歐洲、中東、非洲和亞洲的語言,以及古文和專業符號。Unicode允許交換、處理和顯示多語言文本,以及公用的專業和數學符號。
Unicode字符適用于所有已知的編碼。Unicode是繼ASCII(美國國家交互信息標準編碼)字符碼后的一種新字符編碼,如UTF-16允許用16位字符組合為一百萬或更多的字符。C#提供的字符類型按照國際標準采用了Unicode字符集。
2.char(字符型)
char(字符型)的數據范圍是0~65535的Unicode字符集中的單個字符,占用2字節。
char表示無符號16位整數,char(字符型)的可能值集與Unicode字符集相對應。雖然char型數據的表示形式與ushort(短整型)相同,但ushort與char意義不同,ushort代表的是數值本身,而char代表的則是一個字符。舉例如下。
char FirstChar='A'; //字符型常量必須加單引號來表示
3.string(字符串型)
string(字符串型)是指任意長度的Unicode字符序列,占用字節根據字符多少而定。
string表示包括數字與空格在內的若干個字符序列,允許只包含一個字符的字符串,甚至可以是不包含字符的空字符串。舉例如下。
string UserName="zhangsan"; //字符串型常量必須加雙引號來表示
string UserPwd=""; //連續兩個雙引號表示空字符串
2.2.3 布爾類型和對象類型
bool(布爾型):表示布爾邏輯型數據,其值只能是true(真)或false(假)。需要注意的是,true和false是C#的關鍵字,不能用來定義其他對象的名稱。
bool型數據為程序進行復雜的判斷提供了數據類型依據,另外,在程序進行關系運算或邏輯運算時,也將產生bool型數據結果,所以bool類型數據也常被稱為邏輯型數據。
object(對象型)是所有其他類型的最終基類,其占用字節視具體表示的數據類型而定。C#中的每種類型都是直接或間接從object類型派生的,object表示一個通用類型。一個object類型的變量可以存放任何其他類型的數據。
2.2.4 數據類型轉換
在程序處理數據的過程中,經常需要將一種數據類型轉換為另一種數據類型。例如,用戶在文本框中輸入的數據,若需對其進行數學運算,則首先要將其類型由字符串型轉換為數值類型;而需要顯示到標簽控件中的數字卻需要首先將其轉換成字符串類型。在C#中,數據類型的轉換分為“隱式轉換”與“顯式轉換”兩種。
1.隱式轉換
隱式轉換是系統自動執行的數據類型轉換。隱式轉換的基本原則是允許數值范圍小的類型向數值范圍大的類型轉換,允許無符號整數類型向有符號整數類型轉換。舉例如下。
int x=123456; //為int類型變量賦值
long y=x; //將x的值讀取出來,隱式轉換為long類型后,賦給長整型變量y
uint a=123456; //為無符號整型變量a賦值
long b=a; //將a的值讀取出來,隱式轉換為有符號的長整型后,賦給長整型變量b
C#允許將char(字符)類型的數據隱式轉換為數值范圍在短整型(含短整型)以上的數值類型。舉例如下。
char mychar='A'; //為字符型變量mychar賦值
//讀取mychar的值,隱式轉換為整數65(A的ASCII碼值),與32相加后將結果賦給num
int num=32+mychar;
之所以允許將字符型數據隱式轉換為整數,是因為char類型的數據在內存中保存的實質是整型數據,只是從意義上代表的是Unicode字符集中的一個字符。
在數據之間進行隱式轉換,通常是從低精度的數據類型向高精度的數據類型轉換,它一般不會失敗,也不會導致信息丟失。
2.顯式轉換
顯式轉換也稱為強制轉換,是在代碼中明確指明將某一類型的數據轉換為另一種類型。顯式轉換語句的一般格式為
類型A變量=(類型A)類型B變量; //將類型B變量中的數據轉換成類型A
舉例如下。
int x=600;
short z=(short)x;
將變量x中的值顯式地轉換為short類型,賦值后,變量z的值為600。
實際上,顯式轉換包括了所有的隱式轉換,也就是說把任何隱式轉換寫成顯式轉換的形式都是允許的。與隱式轉換相同,使用顯式轉換同樣可能出現精度下降的情況。舉例如下。
decimal d=234.55M; //應使用M或m類型符說明類型,否則系統會提示出錯
//將十進制變量d中的數據(234.55)轉換為整型后,賦值給整型變量x
int x=(int)d;
將十進制型變量d的值顯式轉換為整型后,其小數部分將被截去,x得到的賦值為234。
3.使用方法進行數據類型的轉換
有時通過隱式或顯式的轉換都無法將一種數據類型轉換為另一種數據類型,例如,在程序設計中經常遇到的,將數值類型轉換為字符串類型,或將字符串類型轉換為數值類型。這種情況通常發生在需要使用文本框中的數據進行數學運算,或者將數值類型的數據顯示在文本框中時。由于文本框的Text屬性是字符串類型,因而必須進行這種數據類型的轉換。為解決類似問題,C#提供了一些專門用于數據類型轉換的方法。
(1)Parse方法
Parse方法用于將特定格式的字符串轉換為數值,其語法格式為
數值類型變量=數值類型.Parse(字符串型表達式);
其中“字符串型表達式”的值必須嚴格符合“數據類型名稱”對數值格式的要求。舉例如下。
int x=int.Parse("123"); //將整型字符串轉換為對應的整型數據
float f=float.Parse("123.45"); //將單精度型字符串轉換為對應的單精度數據
Parse方法也可用于將包含單個字符的字符串數據轉換為char類型。舉例如下。
char mychar=char.Parse("A") //將包含單個字符的字符串轉換為char類型
(2)ToString()方法
ToString()方法可將其他數據類型的變量值轉換為字符串類型。其方法格式為
String類型變量=其他類型變量.ToString();
舉例如下。
int x=123;
string s=x.ToString(); //將整型變量x的值讀取出來,轉換為字符串"123",然后賦值給s
decimal y=10M/3M; //使用標識符M表示這是兩個decimal類型數據相除
label1.Text=y.ToString("f"); //將變量y的值顯示到標簽控件中,保留2位小數點(得到3.33)
label2.Text=y.ToString("f4"); //保留4位小數點(得到3.3333)
(3)Convert類
Convert類包含了眾多進行數據類型轉換的方法,如表2-4所示。
表2-4 Convert類包含的常用類型轉換方法
2.3 運算符與表達式
描述各種不同運算的符號稱為運算符,而參與運算的數據稱為操作數。表達式用來表示某個求值規則,它由運算符、配對的圓括號,以及常量、變量、函數和對象等操作數組合而成。表達式可用來執行運算、處理字符串或測試數據等,每個表達式都產生唯一的值。表達式的類型由運算符的類型決定。
2.3.1 運算符與表達式類型
根據運算符的不同,C#將運算符和表達式分為以下5種類型:算術運算符和算術表達式、字符串運算符和字符串表達式、位運算符和位運算表達式、關系運算符和關系表達式、布爾運算符和布爾表達式。
1.算術運算符與算術表達式
算術運算符包括一元運算符與二元運算符。
由算術運算符與操作數構成的表達式稱為算術表達式。
(1)一元運算符
一元運算符包括:-(取負)、+(取正)、++(增量)、--(減量)。
一元運算符作用于一個操作數,其中“-”與“+”只能放在操作數的左邊,表示操作數為負或為正。
增量與減量符只能用于變量,不能用于常量。表示操作數增1或減1。舉例如下。
int x=10;
++x; //增量,x的值為11,等價于x=x+1
x=5;
x--; //減量,x的值為4,等價于x=x-1
增量與減量運算符既可以放在操作數的左邊,也可以放在操作數的右邊。如果在賦值語句中使用增量或減量運算符,其出現的位置不同,具有的含義也不同。
若增量或減量運算符出現在操作數的左側,表示將操作數先執行增量或減量,再將增(減)結果賦值給“=”左側的變量。
若增量或減量運算符出現在操作數的右側,表示先將未執行增(減)量操作的操作數賦值給“=”左側的變量,再執行增量或減量操作,并將增(減)結果保存在操作數中。舉例如下。
int a,b,c,d;
a=b=10;
c=++a; //先執行增量,再執行賦值,c的值為11
c=b++; //先執行賦值,再執行增量,c的值為10
d=b; //b在上一語句中已執行了增量,故d的值為11
(2)二元運算符
二元運算符包括:+(加)、-(減)、*(乘)、/(除)、%(求余)。其意義與數學中相應運算符的意義基本相同。
說明:%(求余)運算符是以除法的余數作為運算結果,故求余運算也稱為模運算。舉例如下。
int x=6,y=4,z;z=x%y; //z的值為2,即6被4除得余數2
z=y%x; //z的值為4,即4被6除得商0,得余數4
在C#中,求余運算符不僅支持整型數值的運算,也支持實型數值的運算。例如,5%1.5的結果為0.5。
(3)算術表達式
算術表達式是指使用若干二元運算符、數學方法、括號和操作數等元素共同組成的數學式子,與大家熟悉的數學表達式十分相似。舉例如下。
int a,b,c;
c=a*b/(32+b%3); //由運算符、操作數和括號組成的算術表達式
需要注意的是,在算術表達式中所有的括號都要使用圓括號“()”,不能使用“[]”和“{}”。此外,在使用算術表達式時,要特別注意數據類型對最終計算結果的影響。
在使用算術表達式時應特別注意變量的類型,不同數據類型的變量中存儲的數據也可能是不同的,盡管這些數據都是來自相同的計算結果。舉例如下。
int a,b=39;
a=b/2; //a的值為19,而不是19.5
這是由于相除的兩個數都是整型,結果也是整型,小數部分被截去。即使被賦值的是實型變量,兩個整型數相除,也不會保留相除結果的小數部分。舉例如下。
double x;
int a=37,b=4;
x=a/b; //x的值是9而不是9.25
這是由于a和b都是整型,所以運算的結果只能是整型,這個整型結果在賦給雙精度變量x時,才被隱式轉換為雙精度型。因此,x的值自然是9而不是9.25。
兩個整型數相除如果想保留住小數,必須進行顯式轉換。舉例如下。
double x;
int a=37,b=4;
x=(double)a/b; //x的值是9.25
由于a被強制轉換為雙精度型,則b在運算前也被隱式轉換為雙精度型(向數值范圍寬的類型轉換),運算的結果自然也是雙精度型。
2.字符串運算符與字符串表達式
字符串表達式由字符串常量、字符串變量、字符串方法和字符串運算符組成。C#提供的字符串運算符只有一個“+”,它用于連接兩個或更多的字符串。
當兩個字符串用連接運算符“+”連接起來后,第二個字符串直接添加到第一個字符串的尾部,得到一個包含兩個源字符串全部內容的新的字符串。如果要把多個字符串連接起來,每兩個字符串之間都要用“+”分隔開。舉例如下。
string str="中國"+"人民"; //連接后結果為:"中國人民"
string str="ABC"+"D"+"EFG"; //連接后結果為:"ABCDEFG"
string str="12 3"+"45"+"67"; //連接后結果為:"1234567"
字符串連接運算符“+”還可以將字符型數據與字符串型數據或多個字符型數據連接在一起,得到的結果為一個新字符串。舉例如下。
string str='E'+"abcd"+'F'; //str的值為“EabcdF”
3.關系運算符與關系表達式
(1)關系運算符
關系運算符用于對兩個操作數進行比較,判斷關系是否成立,若成立則結果為true,否則為false,即關系運算符的運算結果為布爾型。常用的關系運算符及說明如表2-5所示。
表2-5 C#中常用的關系運算符
需要注意以下兩點。
1)等于運算符由兩個連續的等號“==”構成,以區別于“=”(賦值號)運算符。
2)凡是由兩個符號構成的關系運算符(如==、>=、<=、!=),在使用時兩個符號之間不能有空格,否則將出錯。
(2)關系表達式
關系表達式由操作數和關系運算符組成。關系表達式中既可以包含數值,也可以用于字符或字符串,但是用于字符串的關系運算符只有相等(==)和不等(!=)兩種運算符。
下面的代碼給出了常見的關系表達式使用方法。
int a=5,b=3;
char ca='A',cb='B';
string sa="abcd",sb="abc";
bool i,c,s;
i=a>b; //先進行a>b的比較,然后把比較結果true賦值給i
c=ca>cb; //c的值為false
s=(sa==sb); //s的值為false
需要說明的是,在進行字符或字符串比較時,實際上比較的是字符的Unicode值。上例中兩個字符變量的比較,由于A的ASCII碼值小于B的ASCII碼值,所以ca>cb的關系不成立,運算的結果為false。
字符串的比較與字符比較道理相同,相等運算要求兩個字符串的個數與相應位置上的字符完全相同時運算結果為true,否則運算結果為false。
4.邏輯運算符與邏輯表達式
邏輯表達式(也稱為“布爾表達式”)由關系運算符、邏輯運算符(也稱為“布爾運算符”)連接常量或關系表達式組成,其取值為布爾值(true或false)。通過條件表達式或邏輯表達式可對應用程序計算結果及用戶輸入值進行判斷,并根據判斷結果選取執行不同的代碼段。
邏輯運算符的操作數是布爾類型,運算結果也是布爾類型。在C#中,最常用的邏輯運算符是!(非)、&&(與)、||(或)。
“非”運算是一元運算符,是求原布爾值相反值的運算,如果原值為真,非運算的結果為假,否則為真。
“與”運算是求兩個布爾值都為真的運算,當兩個布爾值都為真時,運算結果為真,即所謂同真為真。
“或”運算是求兩個布爾值中至少有一個為真的運算,當兩個布爾值中至少有一個為真時運算結果為真,只有在兩個布爾值均為假時,運算結果才為假,即所謂同假為假。舉例如下。
bool b1=!(5>3); //b1的值為false
bool b2=(5>3)&&(1>2); //b2的值為false
bool b3=(5>3)||(1>2) //b3的值為true
5.賦值運算符與賦值表達式
在賦值表達式中,賦值運算符左邊的操作數稱為左操作數,賦值運算符右邊的操作數稱為右操作數。其中左操作數必須是一個變量或屬性,而不能是一個常量。
前面介紹過的賦值運算符“=”稱為“簡單賦值運算符”,它與其他算術運算符結合在一起可組成“復合賦值運算符”,如*=、/=、%=、+=、-=等。C#中常用的復合運算符及等價關系如表2-6所示。
表2-6 C#中常用的復合運算符
賦值表達式的一般格式為
左操作數 賦值運算符 右操作數;
使用復合賦值運算符時,系統先將左操作數與右操作數進行“其他運算符”要求的運算,然后再將運算結果賦值給左操作數。例如,x+=y表示先執行x+y的運算,然后再將運算結果賦值給x,所以x+=y等效于x=x+y。
6.條件賦值運算符及表達式
條件賦值表達式可以看作是邏輯表達式和賦值表達式的組合,它可根據邏輯表達式的值(true或false)返回不同的結果。條件運算符由符號?與:組成,通過操作3個操作數完成運算,其一般格式為
變量=關系達式?表達式1:表達式2;
條件賦值表達式在運算時,首先運算“關系表達式”的值,如果為true,則運算結果為“表達式1”的值,否則運算結果為“表達式2”的值。舉例如下。
int x,y;
x=400;
y=x>500?x*0.8:x*0.9; //y的值為360
由于x的值為400,小于500,故條件賦值表達式執行時將返回后一個表達式(x*0.9)的值。
條件賦值表達式也可以嵌套使用,舉例如下。
int x=100,y=100;
string s;
s=x>y?"greater than":x==y?"equal to":"lessthan"; //s的結果為equalto
上例中的條件賦值表達式對照一般格式分析,其中布爾類型表達式為“x>y”,表達式1為“"greater than"”,表達式2本身又是一個完整的條件賦值表達式“(x==y?"equal to":"less than")”。
顯然,通過條件賦值表達式的嵌套,可以實現多分支的選擇判斷。
2.3.2 運算符的優先級與結合性
運算符的優先級與結合性本質上都是運算順序問題,優先級是指當一個表達式中出現不同的運算符時,先進行何種運算。結合性是指當一個表達式中出現兩個以上的同級運算符時,是由左向右運算還是由右向左運算。
1.優先級
運算符的優先級具有以下幾個特點。
1)一元運算符的優先級高于二元和三元運算符。
2)不同種類運算符的優先級有高低之分,算術運算符的優先級高于關系運算符,關系運算符的優先級高于邏輯運算符,邏輯運算符的優先級高于條件運算符,條件運算符的優先級高于賦值運算符。
3)有些同類運算符優先級也有高低之分,在算術運算符中,乘、除、求余的優先級高于加、減;在關系運算符中,小于、大于、小于或等于、大于或等于的優先級高于相等與不等;邏輯運算符的優先級按從高到低排列為非、與、或。
事實上,一個表達式常常是各種運算符混合在一起使用的,當一個表達式中包含不同類型的運算符時,將按照各運算符優先級的不同安排運算順序。舉例如下。
bool b=5*2+8>=9*8||"ABC"=="ABC"&&!(3-2<3*5);
上述表達式的運算執行過程如下。
1)先運算括號內的表達式,括號內的表達式先運算“3*5”結果為15,再運算“3-2”結果為1,然后運算“1<15”,結果為true,這時整個表達式運算的中間結果為“5*2+8>=9*8||"ABC"=="ABC"&&!true”。
2)由于一元運算符的優先級高于二元運算符,所以在第1)步中得出的中間結果的基礎上先運算“!true”,結果為false,得出的中間結果為“5*2+8>=9*8||"ABC"=="ABC"&&false”。
3)在第2)步的中間結果中,優先級最高的是算術運算符,而算術運算符中乘運算符又高于加運算符,所以先運算“5*2”與“9*8”,結果分別為10與72,然后運算“10+8”,結果為18,至此算術運算全部完成,表達式中只剩下關系運算符與邏輯運算符,其中間結果為
18>=72||"ABC"=="ABC"&&false
4)在第3)步的中間結果中,關系運算符優先級高于邏輯運算符,而關系運算符中“>=”運算符的優先級又高于“=”運算符,所以先運算18>=72結果為false,再運算"ABC"=="ABC",結果為true,其中間結果為
false||true&&false
5)表達式運算到第4)步,只剩下邏輯或(||)運算符和邏輯與(&&)運算符,由于與運算符的優先級高于或運算符,所以先運算“true&&false”,根據與運算“同真為真”的規則,運算結果為false,表達式的中間結果為“false||false”,最后進行或運算,根據“同假為假”的規則,最終運算結果為false。
2.圓括號
為了使表達式按正確的順序進行運算,避免實際運算順序不符合設計要求,同時為了提高表達式的可讀性,可以使用圓括號明確運算順序。舉例如下。
string s=x>y?"greater than":x==y?"equal to":"less than";
上述表達式是一個正確的表達式,但為了提高表達式的可讀性,可以添加括號使之成為
string s=x>y?"greater than":(x==y?"equal to":"less than");
使用括號還可以改變表達式的運算順序。例如,b*c+d的運算順序是先進行“b*c”的運算,然后再加“d”,如果表達式加上括號,變為b*(c+d),則運算時會先進行括號內的運算,然后將結果乘“b”。
3.結合性
在多個同級運算符中,賦值運算符與條件運算符是由右向左結合的,除賦值運算符以外的二元運算符是由左向右結合的。例如,x+y+z是按(x+y)+z的順序運算的,而x=y=z是按x=(y=z)的順序運算(賦值)的。
2.4 C#常用方法與屬性
為了方便程序設計中各種數據類型的處理,C#提供了豐富的類方法與類屬性,使用這些方法與屬性,可以提高程序設計的效率。在.NET中為了管理方便,而將各種類、對象劃分到不同的“命名空間”(Namespace)中,各命名空間中又可能包含子空間。在使用類和對象時,如果對應的命名空間尚未使用using命令引用將會出現錯誤。
2.4.1 日期時間類常用方法與屬性
C#中的DateTime類提供了一些常用的日期時間方法與屬性,該類屬于System命名空間。在使用模板創建應用程序時,該命名空間的引用已自動生成,因此可以直接使用DateTime類。對于以當前日期時間為參照的操作,可以使用該類的Now屬性及其方法。
以2017年7月31日星期一,16點17分25秒的當前日期時間為例,日期時間類的Now屬性的常用方法與屬性如表2-7所示。
表2-7 日期時間類的常用方法與屬性
2.4.2 常用數學方法與屬性
C#中的Math類提供了一些常用的數學方法與屬性,該類屬于System命名空間。Math類是一個密封類,有兩個公共屬性和若干靜態數學方法。Math類常用的屬性與方法如表2-8所示。
表2-8 數學類常用屬性與方法
(續)
2.4.3 常用字符串方法與屬性
任何字符串變量與常量對象都具有字符串的方法與屬性,可以使用這些方法與屬性來處理字符串。假設有一個字符串變量s,其值為“abCDeFg”(注意,該字符串前兩個字符為空格),則s就具有如表2-9中所示的字符串常用方法與屬性。
表2-9 處理字符串常用方法與屬性
2.4.4 隨機方法
Random類提供了產生偽隨機數的方法,該方法必須由Random類創建的對象調用。Random類創建對象的格式為
Random隨機對象名稱=new Random();
如果要聲明一個隨機對象r,則代碼為
Random r=new Random();
現假定已經聲明了一個隨機對象r,則隨機方法的使用如表2-10所示。
表2-10 常用隨機方法
需要說明的是,使用Random對象產生某區間內的隨機整數時,下界包含在隨機數內,而上界不包含在隨機數內。例如,隨機數中包含1,但不包含10,即隨機數范圍為1~9。
Random rd=new Random();
in tNum=rd.Next(1,10);
2.5 實訓 C#數據類型與常用方法
2.5.1 實訓目的
了解C#語言的語法規則,理解與掌握C#各種基本數據類型的知識。理解表達式的概念及作用,根據需要正確設計各種類型的表達式。掌握處理各種數據類型常用的方法、屬性和字段,根據需要靈活運用,以提高程序代碼設計效率。
2.5.2 實訓要求
設計一個Windows應用程序,程序啟動時顯示如圖2-1所示的界面。單擊不同的按鈕頁面中將顯示對應數據類型常用方法的使用示例。圖2-2所示為“日期時間”按鈕被單擊時顯示的結果,圖2-3所示為“數學”按鈕被單擊時顯示的結果,圖2-4所示為“字符串”按鈕被單擊時顯示的結果,圖2-5所示為“隨機數”按鈕被單擊時顯示的結果。
圖2-1 程序初始界面
圖2-2 日期時間類型常用方法
圖2-3 常用數學方法
圖2-4 常用字符串方法
圖2-5 常用隨機數方法
2.5.3 實訓步驟
1.設計程序界面
新建一個Windows應用程序項目,向窗體中添加1個用于顯示輸出信息的標簽控件label1和4個按鈕控件button1~button4。
2.設置各控件的屬性
在設計視圖中選中label1控件,在“屬性”窗口中設置其Name屬性為lblResult;分別選中4個按鈕控件,設置它們的Name屬性分別為btnDataTime、btnMath、btnSting和btnRandom,設置它們的Text屬性分別為“日期時間”“數學”“字符串”和“隨機數”。
3.編寫程序代碼
在設計視圖中雙擊某對象可切換到代碼窗口,并由系統自動創建該對象的默認事件框架。例如,雙擊窗體將切換到代碼窗口,并由系統自動創建一個名為Form1_Load的事件處理程序框架。
所謂“事件”,是指用戶或系統對程序執行了某種操作,如頁面加載、單擊按鈕或更改選項等。“事件過程”是指當某事件發生時執行的程序代碼段。例如,書寫在Form1_Load事件過程中的代碼,當窗體裝入時會自動被執行;書寫在button1_Click事件過程中的代碼,在用戶單擊按鈕button1時將被自動執行,這就是Visual Studio的事件驅動編程模式。
窗體裝入時執行的事件過程代碼如下。
“時間日期”按鈕被單擊時執行的事件處理程序代碼如下。
“數學”按鈕被單擊時執行的事件處理程序代碼如下。
“字符串”按鈕被單擊時執行的事件處理程序代碼如下。
“隨機數”按鈕被單擊時執行的事件處理程序代碼如下。
說明:
1)雙引號是字符串常量的定界符,若字符串的內容中也使用了雙引號,則應當使用“\"”轉義符,否則程序將出錯。
2)為了使標簽控件中的文字產生換行,程序中使用了表示換行符的轉義符“\n”("\n\n"表示產生兩個換行符,使行與行之間保留一個空行)。
3)程序中使用了復合運算符“+=”。如,“x+=y;”等效于“x=x+y;”。
- Python網絡爬蟲從入門到實踐(第2版)
- INSTANT Mercurial SCM Essentials How-to
- Java設計模式及實踐
- 表哥的Access入門:以Excel視角快速學習數據庫開發(第2版)
- Hands-On Full Stack Development with Go
- C# Multithreaded and Parallel Programming
- Visual Studio Code 權威指南
- BeagleBone Robotic Projects(Second Edition)
- 大學計算機基礎
- Getting Started with Python
- Java 從入門到項目實踐(超值版)
- OpenCV 3計算機視覺:Python語言實現(原書第2版)
- Visual Basic語言程序設計上機指導與練習(第3版)
- 一覽眾山小:ASP.NET Web開發修行實錄
- Java面向對象程序設計教程