1. 程式人生 > >C#OOP之二 變量和表達式

C#OOP之二 變量和表達式

先來 技術 特定 小寫字母 中間 依據 相同 算法 簡單

技術分享

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 變量的聲明和賦值

學完變量的命名規則後,變量的聲明和賦值是很easy的。變量在聲明的時候首先要知道所定義的變量是什麽類型的,在去聲明你所定義的變量;變量的賦值——變量能夠在聲明的時候賦值。也能夠聲明後在以下用到該變量時對其進行賦值。以下我們來看下變量的聲明和賦值的演示樣例:

int age=20。//在聲明變量時直接給變量賦值

int age。

age =20。//先聲明變量,在對變量進行賦值

總的來講。變量的聲明和賦值的語法是:

數據類型 變量名。

變量名=初始值;

數據類型 變量名=初始值;

2.3運算符和表達式

上一節我們學習了變量,那麽變量和變量之間怎麽聯系起來呢?今天我們來學習運算符和表達式。

在程序語言中。變量是字詞。通過運算符將變量連接成表達式,表達式相當於語言中的短句。

運算符最常見的就是加、減、乘、除,這些運算符每個小型的計算器都有。當然程序語言支持的運算符不止這些,每個程序語言提供的運算符號稍有些不同。但大體上都一樣。在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);

}

else

  Console.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型須要加f

bool  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);

 else

  Console.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 運算符的優先級

練習項目:

學過變量和表達式。請大家發揮自己的想象,做一個和本章緊密相連的項目:

需達到效果例如以下:

在這個項目中,每種運算符至少用一個說明你掌握了此類運算符;運算中要考慮運算符的優先級。聲明的變量類型要恰當。


C#OOP之二 變量和表達式