運算子
運算子簡單舉例就是生活中的+-*/等等運算子號,下面會詳細討論運算子內容,
一元正負運算子
有時候需要改變數值的正負號,一元運算子(-)可以使得數字的正負號改變,
例如: int a = -114514
一元運算子等價于從零減去運算元,對應的也有一元運算子(+),不過這個運算子可以說是多余的,
二元算術運算子
二元運算子有: +、-、*、/、%,
在C#當中,只有賦值、呼叫、遞增、遞減、await和物件創建運算式才能作為獨立陳述句使用,
下面分別介紹各項的作用:
- +:加法運算
- -:減法運算
- *:乘法運算
- /:除法運算
- %:求余運算(取模)
運算子的執行順序取決于它們的優先級和結合性,
- *、/、%擁有最高優先級,
- +和-具有降低優先級,
- =在6個運算子中優先級最低,
- 添加括號可以改變運算順序,與數學運算一致,
- 運算元總是從左到右求值,
復合賦值運算子
符合賦值運算子表是將常見的二元運算子與賦值運算子結合起來,
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 |
邏輯運算子
- OR運算子(||):
||運算子對兩個運算式求值,任何一個為true就回傳true,
if(x > 1 || y <6){
codeBlock;
}
- AND運算子(&&):
&&運算子在兩個運算元都為true的情況下才回傳true,任何運算元為false都會回傳false,
if(x > 1 && y <6){
codeBlock;
}
- 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關鍵字宣告變數,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/98018.html
標籤:C#
下一篇:6.1 自定義abp攔截器示例
