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