C#深入淺出之操作符和控制流程

来源:https://www.cnblogs.com/lehanbal/archive/2019/12/03/11976900.html

操作符 操作符簡單舉例就是生活中的+ /等等運算符號,下麵會詳細討論運算符內容。 一元正負操作符 有時候需要改變數值的正負號。一元操作符( )可以使得數字的正負號改變。 例如: 一元操作符等價於從零減去操作數。對應的也有一元操作符(+),不過這個操作符可以說是多餘的。 二元算術操作符 二元操作符有: ...


操作符

操作符簡單舉例就是生活中的+-*/等等運算符號,下麵會詳細討論運算符內容。

一元正負操作符

有時候需要改變數值的正負號。一元操作符(-)可以使得數字的正負號改變。

例如:int a = -114514

一元操作符等價於從零減去操作數。對應的也有一元操作符(+),不過這個操作符可以說是多餘的。

二元算術操作符

二元操作符有: +、-、*、/、%。

在C#當中,只有賦值、調用、遞增、遞減、await和對象創建表達式才能作為獨立語句使用。

下麵分別介紹各項的作用:

  • +:加法運算
  • -:減法運算
  • *:乘法運算
  • /:除法運算
  • %:求餘運算(取模)

操作符的執行順序取決於它們的優先順序和結合性。

  1. *、/、%擁有最高優先順序。
  2. +和-具有降低優先順序。
  3. =在6個操作符中優先順序最低。
  4. 添加括弧可以改變運算順序,與數學運算一致。
  5. 操作數總是從左到右求值。

複合賦值操作符

符合賦值操作符表是將常見的二元操作符與賦值操作符結合起來。

int x =123;

x += 114514;

上述為複合賦值操作符用法,其他同理。

遞增和遞減操作符

C#提供一種特殊的一元操作符來實現及數據的遞增和遞減。

++:為操作數加一。

--:為操作數減一。

其中需要註意的是。遞增和遞減操作符的首碼使用和尾碼使用。

int x = 114514;
System.Console.WriteLine($"{x++},{++x},{x}");
//Console: 114514,114516,114516

首碼遞增顯示的是遞增結束後的值,而尾碼遞增則是顯示遞增開始之前的值。但是二者的最終結果都是操作數加一

常量表達式和常量符號

可用操作符將多個字面值合併到常量表達式中。

const關鍵字的作用就是聲明產量符號。因為常量不可變,在後續的代碼中嘗試對其進行修改都會報錯。

const int ye = 114 * 514;
//常量表達式
const int er = ye * 2;
//常量

控制流程概述

if語句

if語句是C#最常見的語句之一。它對稱為條件的布爾表達式進行求值,條件為true將執行後續語句。if語句可以有else子句,其中包含在條件為false時執行的代替語句。

if(flag)
    consequence-statement
else
    alternative-statement

嵌套if

代碼有時候需要多個if語句。為了面對這個情況,if之內是可以再次聲明if,進行多重嵌套。

if(flag):
    codeBlock;
    if(flag1):
        codeBlock1;
            ....

為了分清嵌套結構,代碼進行縮進,空白並不影響執行路徑,但是我們需要要考慮代碼的可讀性。

if/else連貫格式如下:

if(input == 1)
    System.Console.WriteLine(1);
else if(input == 2)
    System.Console.WriteLine(2);
else if (input == 3)
    System.Console.WriteLine(3);
else
    System.Console.WriteLine(4);

無論哪一種情況,都應該選擇代碼最易讀的格式。

代碼塊

在前面的if語句當中,if和else之後直接跟隨了一個語句。這種情況只有在執行語句只有一行的時候可以使用。

可用大括弧將多個語句合併成代碼塊,以實現在符合條件時執行多個語句。如:

if(input >9){
    int a = 100;
    Console.WriteLine(a);
}

建議在任何情況下,都採用後者大括弧將多個語句合併成代碼塊的語法方式來進行代碼的書寫。避免不必要的語法錯誤,也可增加自己的代碼的可讀性。

代碼塊、作用域和聲明空間

代碼塊經常被稱為作用域。但是兩個術語並不完全相等。具名事物的作用域是源代碼的一個區域。可在該區域使用非限定名稱引用該事物。局部變數的作用域就是封閉它的代碼塊。所以代碼塊經常會被稱為“作用域”。

聲明空間是具名事物的邏輯容器。該容器中不能存在同名的兩個事物。代碼塊不僅定義了作用域,還定義了局部變數聲明空間。在同一個聲明空間中,不允許聲明兩個同名的局部變數。在聲明局部變數的代碼塊外部,沒有辦法用局部變數的名稱引用它,這時候會提示“超出作用域”。

聲明空間覆蓋所有子代碼塊。C#禁止編譯一個代碼塊中聲明的局部變數在其子代碼塊中重覆聲明。

布爾表達式

條件,也就是布爾表達式。如 if( input > 1 ) 括弧內的內容即布爾表達式。求值永遠是true或false,在C#當中,布爾表達式必須返回bool值

關係操作符和相等性操作符

用於判斷一個值是否大於、小於或者等於另外一個值。它們都是二元操作符。

運算符 說明 示例
< 小於 input < 1
> 大於 input > 1
<= 小於或等於 input <= 1
>= 大於或等於 input >= 1
== 等於 input == 1
!= 不等於 input != 1

邏輯操作符

  1. OR操作符(||):

||操作符對兩個表達式求值,任何一個為true就返回true。

if(x > 1 || y <6){
    codeBlock;
}
  1. AND操作符(&&):

&&操作符在兩個操作數都為true的情況下才返回true。任何操作數為false都會返回false。

if(x > 1 && y <6){
    codeBlock;
}
  1. XOR操作符(^):

運用於兩個布爾操作數的情況下,只有在兩個操作數僅有一個為true的前提下,XOR操作符才會返回true。

邏輯求反操作符

邏輯求反操作符(!)有時也稱為NOT操作符,作用是反轉一個bool操作類型的值。

bool valid = true;
bool result = !valid;
//Console:result = false

條件操作符

條件操作符(?:)為三元操作符,需要三個操作數,常規格式如下:

codition ? consequence : alternative

所表達的意思為:若codition求值為true,則操作符只求值consequence;否則只求值alternative。並且支持短路求值,順序從左到右。

consequence與alternative的類型必須一致

空合併操作符

空合併操作符??能簡單表示“如果這個值為空,就是用另一個值”:

expression1??expression2

支持短路求值。如expression1不為null,就返回expression1的值,另一個表達式不求值。如果expression1求值為null,就返回expression2的值。空合併操作符屬於二元操作符。

空條件操作符

對空值進行方法調用,都會拋出一個空值異常,說明程式邏輯肯定出錯了。為此C#6.0引入了 ?. 操作符,稱為空條件操作符空傳播操作符

args?.Length == 0

等價於以下代碼:

(args != null) ? (int?)args.Length : null

空條件操作符最方便之處在於可“鏈接”,以下舉例:

args[0]?.ToLower().StartsWith(...)

上述例子如果在第一個操作數為空,整個表達式會被短路,調用鏈中不再發生其他調用。

註意不要遺漏額外的空條件操作符!!!!

另一個重點:用於返回值類型的成員時,總是返回該類型的可空版本。(如:返回 int? 而不是 int )

此外,空條件操作符也可與索引操作符連用,例如:

string first = args?[0];

意思是只有args非空,才會對變數賦值,否則賦值null。

但是上述例子需要註意!他表示的意思是只要args非空就一定存在元素,但是會存在特殊清空,數組非空的情況下也不一定會存在元素。為此我們應該避免和索引操作符組合使用空條件操作符

按位操作符

該操作符用於處理二進位形式的值。

位移操作符

位移操作符(<<、>>、<<=、>>=),有時候需要將一個數的二進位值向左或者向右移。左移時,所有位都向左移動由操作符右側的操作數指定的位數。移位後在右。邊留下的空位由零填充。右移同理。但如果移動的是複蘇,左側填充1而不是0。兩個唯一操作符是>>和<<,分別是右移操作符和左移操作符。

int x = -7;
x = (-7 >> 2); // 1111 1111 1111 1001
               // 1111 1111 1111 1110
//x = -2

按位操作符

按位操作符(&、|、^),分別對應AND,OR,XOR。

byte and,or,xor;
and = 12 & 7; //and = 4
or = 12 | 7; //or = 15
xor = 12 ^ 7; //xor = 11

按位操作數不支持短路求值,即使左邊的操作數為false,兩邊都會進行求值。

按位複合操作符

按位操作符也可以與賦值操作合併,即&=、|=和^=。

and &= 1;//and = and & 1
or |= 1;// or = or | 1
xor ^= 1;// xor = xor ^ 1

按位取反操作符

按位取反操作數反轉操作數的每一位,操作數可以是int、uint、long和ulong類型。如~1返回1111 1111 1111 1111 1111 1111 1111 1110。

控制流程語句

while和do/while迴圈

它是最簡單的條件迴圈。

while(condition):
    statement

condition必須是布爾表達式,只要它求值為true,作為迴圈主體的語句(statement)就會反覆執行下去。條件求值為false,就跳過迴圈主體,從它之後的語句開始執行。

do/while迴圈與while迴圈非常相似,區別在於迴圈主體至少執行一次。do/while的常規結構如下:

do{
    statement
}while(condition)

for迴圈

for迴圈反覆執行代碼塊直至滿足指定條件。for迴圈有一套內建的語法規定瞭如何初始化,遞增以及測試一個計數器的值。該計數器稱為迴圈變數。由於迴圈語法中專門有一個位置是為遞增/遞減操作保留的,所以遞增/遞減操作符經常為for迴圈的一部分使用。

舉例:

/*
for(int i = 0; i < 10; i++){
    statement
}
*/

for(initial; condition; loop){
    statement
}

initial(初始化)執行首次迭代前的初始化操作。

condition(條件)指定迴圈結束條件。

loop(迴圈)表達式在每次迭代後求值。

statement是在條件表達式為true時執行的迴圈主體。

for(;;){ ... }完全有效,只要想辦法從迴圈中跳出即可,缺失的條件預設為產量true。

for迴圈也可使用多個表達式,這裡不詳細說明。

foreach迴圈

C#最後一個迴圈語句是foreach,它遍曆數據項集合,設置迴圈變數來依次表示其中每一項。迴圈主體對數據項執行指定操作。foreach迴圈的特點是每一項只遍歷一次:不會出現越界報錯。

foreach(type variable in collection){
    statement
}

type為代表collection中每一項的variable聲明數據類型。

variable是只讀變數,foreach迴圈自動將collection中的下一項賦值給它。

collection是代表多個數據項的表達式,比如數組。

foreach迴圈期間禁止修改迴圈變數,因為迴圈變數是只讀內容

基本switch語句

一個值和多個常量值比較,switch比if語句更容易理解。

switch(expression){
    case constant:
        statement;
        break;
    default:
        statement;
}

expression是要和不同常量比較的值。

constant是和主導類型相容的任何產量表達式。

一個或者多個case標簽(或者default標簽),後跟一個或多個語句。

每一個statement語句的結束點都必須接上跳轉語句,如:break、return。

跳轉語句

迴圈的執行路徑可改變,事實上,可用跳轉語句退出迴圈。

break語句

任何時候遇到break語句,控制都會立即離開迴圈或switch。

continue語句

contiue語句跳轉到當前迭代的末尾,並開始下一次迭代。C#的contiue語句允許退出當前迭代並跳到迴圈條件。如果迴圈條件為true,迴圈繼續。

小結

本節介紹了C#賦值和算數運算符。如何使用操作符和const關鍵字聲明變數。


您的分享是我們最大的動力!

更多相關文章
  • 認證與授權一直以來都是很多人在討論的話題,之所以想這次談一談認證和授權,主要是因為最近看到許多文章都把認證和授權混為一談,把認證方式當作是授權方式。所以想寫篇文章談談我眼中的認證與授權 ...
  • IEnumerable是可枚舉的所有非泛型集合的基介面, IEnumerable包含一個方法GetEnumerator(),該方法返回一個IEnumerator;IEnumerator提供通過Current屬性以及MoveNext()和Reset()方法來迴圈訪問集合的功能。 ...
  • 一個簡單、基於AbpInterceptor的攔截器示例: 攔截器調用順序,可參考打上斷點調試分析: AutofacRegistration.Populate(內部調用Autofac.Extras.DynamicProxy) SimpleAsyncInterceptor.Intercept Castl ...
  • 在較早期的報表套打的時候,我傾向於使用LODOP的ActiveX進行報表的列印或者套打,BS效果還是很不錯的。之前利用它在Winform程式裡面實現信封套打功能,詳細參考《基於信封套打以及批量列印的實現過程》,雖然功能能夠完美實現,不過由於還需要附帶一個不是百分百整合一起的插件,還是有點另類的,雖然... ...
  • 在.NET Core中想給API進行安全認證,最簡單的無非就是Jwt,悠然記得一年前寫的Jwt Demo,現在拿回來改成.NET Core的,但是在編碼上的改變並不大,因為Jwt已經足夠強大了。在項目中分為 DotNetCore_Jwt_Server 以及 DotNetCore_Jwt_Client ...
  • 原文:http://www.zilaohu.cn/Jie/Detail_Jie?ID=78840a04-55b8-4988-80b2-f964fd822d63 下麵配置後:被拒絕的域請求後,可以進入方法,在瀏覽器接收響應的時候被當作是拒絕的。主要步驟:1.ConfigureServices()註冊c ...
  • 一、前言 由於公司要求項目需要走CI構建平臺,拋棄掉之前的人工編譯打包方式,所以需要調研一下項目怎麼通過命令行編譯出產物。 二、準備工作 1. 在構建機器上安裝vs(本文示例為vs2017) 2. 將代碼上傳版本控制倉庫(本文示例為Gitlab),並確保構建機器可以正常訪問並下載源代碼 3. 確保構 ...
  • 在MainWindow中,創建一個背景屬性BrushTest,並將其綁定至界面上UserControl的BackgroundTest屬性 UserControl,同樣添加一個BackgroundTest屬性,並將其綁定至界面。 運行後,控制台輸出綁定異常,背景設置並沒有生效。 System.Wind ...
一周排行
  • 前言 上一篇文章主要介紹了ObjectPool的理論知識,再來介紹一下Microsoft.Extensions.ObjectPool是如何實現的. 核心組件 ObjectPool ObjectPool 是一個泛型抽象介面,他抽象了兩個方法Get和Return Get方法用於從對象池獲取到可用對象,如 ...
  • 國內優秀的WPF開源控制項庫,Panuon.UI的優化版本。一個漂亮的、使用樣式與附加屬性的WPF UI控制項庫,值得向大家推薦使用與學習。 今天站長(Dotnet9,站長網址:https://dotnet9.com, 微信公眾號:dotnet9_com)推薦另一款開源的WPF控制項庫(PanuonUI. ...
  • WGS-84坐標系:全球定位系統使用,GPS、北斗等 GCJ-02坐標系:中國地區使用,由WGS-84偏移而來 BD-09坐標系:百度專用,由GCJ-02偏移而來 (PS:源於項目需求,本來是想讀圖片的經緯度顯示在百度離線地圖上的。後來發現定位偏差太大,仔細一想,原來是圖片和百度使用的坐標系不一樣。 ...
  • .NET Core3.1發佈 我們很高興宣佈.NET Core 3.1的發佈。實際上,這隻是對我們兩個多月前發佈的.NET Core 3.0的一小部分修複和完善。最重要的是.NET Core 3.1是長期支持(LTS)版本,並且將支持三年。和過去一樣,我們希望花一些時間來發佈下一個LTS版本。額外的 ...
  • based on https://stackoverflow.com/questions/659013/accessing-a-shared-file-unc-from-a-remote-non-trusted-domain-with-credentials ...
  • private static void PathCopyFilesWithOriginalFolder() { int sourceFilesNum = 0; try { string sourceDir = @"E:\Source"; string destDir = @"E:\Dest"; st... ...
  • 前言 上一次資料庫災備和性能優化後,資料庫專家建議,在不擴容的情況下,客戶端不能再頻繁的掃描資料庫了!一句驚醒夢中人,因為我也發現資料庫越來越卡了,自從上個項目上線後,就出現了這個情況。後來分析其原因,發現客戶端每3秒中掃描一次資料庫,一共5000+客戶端,可想而知,頻繁掃描嚴重影響到資料庫性能。所 ...
  • 2019.12.4今天開通博客,跌跌撞撞學了3年C#,感覺有了基礎但還不夠深入,有些東西學了又忘,特此開通博客做一個記錄,記錄下以後學習中的每一個知識點,再接再厲,每天進步一點點!!!!!! ...
  • 本人剛接觸.net core 由於公司項目需要部署在Linux上 近些日子學習和網上大面積搜教程 我在這給大家歸攏歸攏借鑒的教程做了套方案(我寫的可以實現 但不一定是最好的 僅供參考) 我只用過core3.0 之前的版本沒接觸過 首先需要使用Nginx反代理的項目那一定是web框架的ASP.NET ...
  • WinFrm應用程式調用WebService服務 關於WebService的創建、發佈與部署等相關操作不再贅述,傳送門如下:C# VS2019 WebService創建與發佈,並部署到Windows Server 2012R 此篇記錄一下客戶端的調用,以便後續學習使用,不足之處請指出。 建立WinF ...
x