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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...