C#基礎表達式語句詳解(上)


本節內容:

1.表達式的定義;

2.各類表達式概覽;

3.語句的定義;

4.語句詳解;

 

1.表達式的定義:

1.1什么是表達式:

(定義見下圖)各類編程語言對表達式的實現不盡相同,但大體上都符合這個定義

什么是編程?運用語句編寫程序!

 

語句是高級語言的語法,編譯語法語言和機器語言只有指令(高級語言中的表達式對應低級語言中的指令)語句等價於一個或者一組有明顯邏輯關聯的指令。

 

貼近人類思維的編程語言叫做高級語言,貼近計算機硬件的語言叫做匯編語言(低級語言)使用低級語言編程照顧的是硬件,也就是想辦法讓程序能夠讓cpu直接讀懂,cpu能夠讀懂的就是指令,所以用低級語言編寫的程序就是一大長串的指令(這樣我們編寫調試的效率都非常低)。編譯器的作用是把高級語言編譯成cpu能看懂的低級語言。一個比喻:指令相當於我們使用的詞匯,語句相當於我們使用的句子。

如何查看高級語言經過編譯器編譯后產生的匯編語言?項目->最后一個選項卡”xx(項目名)屬性”->配置屬性(第二個選項卡)->C/C++輸出文件->匯編程序輸出:帶源代碼的程序集。(這是打開C語言匯編程序的方法)

如何查看C#經過編譯器生成的低級代碼呢?

 

在開始菜單搜索欄輸入”visual”找到visual Studio Tools然后打開ARM兼容工具命令提示,在命名行窗口中輸入ildasm就會彈出一個工具窗口,點擊文件,添加C#程序源文件夾下的exe可執行文件,雙擊對應的程序就會顯示其經編譯器生成的低級語言編寫的指令集。

 

1.2C#語言表達式的定義(見下圖)

 

算法邏輯的最小(最基本)單元,表達一定的算法意圖

因為操作符有優先級,所以表達式也就有了優先級。

語句的作用是什么呀:簡而言之:語句是陳述算法思想,控制邏輯走向,完成有意義的動作。

*並不是所有以;結尾的都是語句,比如using System;這是引入名稱空間的指令,不是語句。再如:一個類里面的聲明:public string Name;叫字段的聲明不叫語句。

那什么才是語句呢?語句一定出現在方法體里面的(而不是類體,或者引入名稱空間之類的),如main方法體里面的以分號結尾的都是語句。

在程序的源文件夾里面打開bin->debug在這個文件夾的空白處shift+右鍵可以看到有:在此處打開powershell窗口,點擊它可以出現命令輸入窗口在這里面可以執行改文件夾里面的exe文件:

 

2、各類表達式概覽

2.1C#語言中表達式的分類

*A value,Every value has an associated type,任何能得到值的運算(回顧操作符和結構類型)

表達式經過運算之后能夠產生一個值而這個值又具有自己的數據類型,所以說我們也把表達式所產生的值(很多情況下與操作符有關系)的數據類型稱為這個表達式的數據類型。例如:這有一個布爾類型的表達式,指的就是這個表達式在經過運算之后所得到的數據是布爾類型的:

var d = 3 < 5;

            Console.WriteLine(d);

            Console.WriteLine(d.GetType().FullName);

賦值表達式的值與賦值操作符左邊的值相等;

*A variable,Every variable has an associated type,

*A namespace

*A Type

*A method group;例如Console.WriteLine。這是一組方法,重載決策決定具體調用哪一個。

比如Console.WriteLine(),不寫參數的時候該表達式返回的是一組方法(19個重載方法),

通過”()”操作符調用方法。

*A NULL literalNull值(不屬於任何一種數據類型)即為一個表達式。
*An anonymous function:匿名方法,返回值為委托

*A Property access:屬性訪問

*An event access:事件訪問

*An indexer access:訪問索引器

*Nothing 對返回值為void的方法的調用

*關鍵部分:

語句詳解:

首先可以分為三大類:標簽語句;聲明語句;嵌入式語句

什么語句可以當做嵌入式語句來使用呢?

詳見列表↑橫線以上表示初學者也要熟練使用的語句,橫線以下的語句相對較高級或少用,暫時用不到;

*Else分支永遠都是與離它最近的沒有esle配對的if配對。

 

2.2聲明語句:

判斷:int x=100;int xx=100;是不是一回事?不是一回事int x=100;這種寫法叫做聲明變量的時候追加了變量的初始化器”=100”;另外一種寫法”int x;”叫做聲明的時候沒有初始化而在后面對變量進行了賦值。前面是一步操作后面是兩步操作。

一般不會int x,y,z;地定義變量,這樣寫會降低程序可讀性。

  int[] myArray={1,2,3};等號右邊的叫數組的初始化器。

*常量聲明語句

常量:在聲明和初始化之后值不能改變的量。

    const int x = 100;格式為

常量在聲明的同時必須賦值(后面跟上初始化器),不能分開。

也可以理解,如果錯過了初始化的機會再給它賦值,語法上就不允許。

 

2.3表達式語句

語句表達式:簡而言之可以形成語句的表達式;

*即表達式后面加上分號(;)就是一條語句!

*不是所有的表達式都可以作為語句來使用。

*那么哪些表達式可以作為語句來使用的?

①調用表達式(即用”()”調用方法的表達式)補充:Console.WritLine這是成員訪問還不是方法調用,要加上圓括號(方法調用操作符)才是方法調用Console.WritLine();

②對象創建表達式:就是用new操作符構成的表達式,補充:new操作符會創建一個對象並調用這個對象的構造器,比如new Form();雖然沒有變量引用它,很快就會被垃圾收集器把這個對象回收,但是這並不妨礙它成為一個可以編譯過去的語句、

③賦值表達式、

前置的自增表達式、后置的自增表達式,后置的自減表達式,前置的自減表達式。(x++x----x++x

Await表達式(先不講)

*表達式值的丟棄:像方法調用表達式;Add(3,4);自增表達式:x++;他們本身都是有值的如果沒有變量引用他們表達式本身的值就會被丟棄。那為什么C#語言會允許這樣的現象產生呢?如果方法是這樣的:

 static double Add(double a,double b)

{

    double result = a + b;

    Console.WriteLine("Result={0}",result);//事件1打印結果

    return a+b;//事件2返回結果

}

我們在main函數中這樣調用它Add(3,4);則會輸出Add方法里面相關輸出語句的內容。這樣的好處是:目前我只關心的是把這個值打印出來,至於這個值我並不想存儲它。

不過平時寫程序要盡量避免寫這樣的方法,因為這樣一個方法做了兩件事,我們寫程序要追求一個原則:single responsibility叫做單一職責原則:即一個方法盡量只做一件事情!

*當一個方法做兩件事情的時候,有一件事情一定是它的主功能,另一件事情是副功能,這樣在未來無論哪個功能需求上發生了變化我們都要回來改這個方法,而如果有別的方法還調用這個副方法的話(所以要求低耦合),這個改動就會引入意想不到的bug,這時候的代碼設計是有問題的。所以說寫程序的時候要避免:一個方法里面有多個功能!

 int x = 100;

            int y = 200;

            x + y;

這里x+y語句是毫無意義的,C#不允許,而C語言允許(如100;X;Y;這些毫無意義的語句都允許),每一種語言對語句的定義都不完全相同。所以說C#語言對語句的定義要嚴格得多。

 

2.4塊語句(block

塊語句:用於只允許使用單個語句的上下文中編寫多條語句。(可以想象block是一個語句的容器,在block這一條語句里面可以容納多條語句)

格式:block:

{

Statement-list;(可以不寫但是大多時候要寫)(意味着C#里面的所有語句都可以寫在里面)

}

舉例:

namespace dmeo5塊語句

{

    class Program

    {

        static void Main(string[] args)

        {

        }

    }

}

上面程序里面有很多花括號,都是塊語句嗎?不是,最外層的{}表示名稱空間的名稱空間體;中間的{}表示Program類的類體;最內層的{}表示main方法的方法體。

那我怎么知道哪些是塊語句呢?語句是在方法體里面的,當看到方法體里面有{}就是塊語句。

*塊語句無論什么時候都會被編譯器當做一條語句來看待,無論一個塊語句里面容納了多少子語句。

*編譯器會認為塊語句是一條完整的語句,就是說寫完塊語句之后不用在{}后面加;.

塊語句舉例:

 static void Main(string[] args)

        {

            {

                int x = 100;

                if (x>80)

                {

                    Console.WriteLine(x);

                }

            }

        }

{}花括號內便是塊語句,塊語句中可以是C#語言的全部三種語句,比如標簽語句:

 hello: Console.WriteLine("Hello world");這就是一個標簽語句,表示

Console.WriteLine("Hello world");hello標記了。可以使用goto來跳轉到指定標簽的語句中:

hello: Console.WriteLine("Hello world");

            goto hello;//死循環

*使用快捷鍵Ctrl+]可以在一對花括號間來回跳動。

塊語句一般與都是與if語句,for語句和while語句一起用的,不要亂用

*什么變量的作用域?在塊語句之前和之后聲明的變量塊語句都是可以訪問它的,而在塊語句聲明的變量,出了塊語句之后就不能被訪問了。比如:

{

Int y=100;

Console.WriteLine(y);

}

Y的作用域准確來講是在這個塊語句里面(在變量y聲明之后)

剩下內容見下期。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM