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

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

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


操作符

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

一元正負操作符

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

例如: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關鍵字聲明變數。


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

-Advertisement-
Play Games
更多相關文章
  • 認證與授權一直以來都是很多人在討論的話題,之所以想這次談一談認證和授權,主要是因為最近看到許多文章都把認證和授權混為一談,把認證方式當作是授權方式。所以想寫篇文章談談我眼中的認證與授權 ...
  • 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 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...