如果想根據(jù)一個(gè)布爾表達(dá)式的結(jié)果選擇執(zhí)行兩個(gè)不同的代碼塊,就可以使用if語(yǔ)句。
理解if語(yǔ)句的語(yǔ)法
if語(yǔ)句的語(yǔ)法格式如下(if和else是關(guān)鍵字):
if ( booleanExpression )
statement-1;
else
statement-2;
如果booleanExpression求值為true,就運(yùn)行 statement-1;否則就運(yùn)行statement-2。else關(guān)鍵字和后續(xù)的statement-2是可有可無(wú)的。如果沒(méi)有else子句,那么在booleanExpression為false的前提下,什么都不會(huì)發(fā)生。
例如,以下if語(yǔ)句用于遞增一個(gè)秒表的秒針(暫時(shí)忽略分鐘)。如果seconds的值是59,就重置為0;否則就使用操作符++來(lái)遞增:
int seconds;
...
if (seconds == 59)
seconds = 0;
else
seconds++;
只使用布爾表達(dá)式!
if語(yǔ)句中的表達(dá)式必須放在一對(duì)圓括號(hào)中。除此之外,表達(dá)式必須是布爾表達(dá)式。在另一些語(yǔ)言中(尤其是C和C++),還可以使用一個(gè)整數(shù)表達(dá)式,編譯器能自動(dòng)將整數(shù)值轉(zhuǎn)換成true(非零值)或false(零值)。C#不允許這樣做。如果寫(xiě)這樣的一個(gè)表達(dá)式,編譯器會(huì)報(bào)錯(cuò)。
假如在if語(yǔ)句中不慎寫(xiě)了一個(gè)賦值表達(dá)式,而不是執(zhí)行一個(gè)相等性測(cè)試,C#編譯器也能識(shí)別你的錯(cuò)誤。例如:
int seconds;
...
if (seconds = 59) // 編譯時(shí)錯(cuò)誤
...
if (seconds == 59) // 正確
不慎而寫(xiě)成賦值表達(dá)式,是C和C++程序容易出現(xiàn)bug的另一個(gè)原因。在C和C++中,會(huì)將所賦的值(59)悄悄地轉(zhuǎn)換成一個(gè)布爾值(任何非零的值都會(huì)被視為true),造成每次都必定執(zhí)行if語(yǔ)句之后的代碼。
最后,可以將一個(gè)布爾變量作為表達(dá)式使用,如下例所示:
bool inWord;
...
if (inWord == true) // 可以,但不常用
...
if (inWord) // 更好
使用塊來(lái)分組語(yǔ)句
有時(shí),需要在一個(gè)布爾表達(dá)式為true的前提下運(yùn)行兩個(gè)或者更多的語(yǔ)句??梢詫⒁\(yùn)行的語(yǔ)句分組到一個(gè)新方法中,然后調(diào)用那個(gè)方法。但是,一個(gè)更簡(jiǎn)單的做法是將語(yǔ)句分組到一個(gè)塊(block)中。塊是指用一對(duì)大括號(hào)來(lái)封閉的一系列語(yǔ)句。在下例中,兩個(gè)語(yǔ)句將seconds變量重置為零,并使minutes變量遞增。我們用一個(gè)塊來(lái)分組這兩個(gè)語(yǔ)句。假如seconds的值等于59,就執(zhí)行該塊:
int seconds = 0;
int minutes = 0;
...
if (seconds == 59)
{
seconds = 0;
minutes++;
}
else
seconds++;
重要提示 假如遺漏大括號(hào),將造成兩個(gè)嚴(yán)重后果。首先,C#編譯器只將第一個(gè)語(yǔ)句(seconds=0)與if語(yǔ)句關(guān)聯(lián)起來(lái),下一個(gè)語(yǔ)句(minutes++)將不再成為if語(yǔ)句的一部分。其次,當(dāng)編譯器遇到else關(guān)鍵字時(shí),不會(huì)將它與前一個(gè)if語(yǔ)句關(guān)聯(lián)起來(lái),所以會(huì)報(bào)告語(yǔ)法錯(cuò)誤。
理解if語(yǔ)句的語(yǔ)法
if語(yǔ)句的語(yǔ)法格式如下(if和else是關(guān)鍵字):
if ( booleanExpression )
statement-1;
else
statement-2;
如果booleanExpression求值為true,就運(yùn)行 statement-1;否則就運(yùn)行statement-2。else關(guān)鍵字和后續(xù)的statement-2是可有可無(wú)的。如果沒(méi)有else子句,那么在booleanExpression為false的前提下,什么都不會(huì)發(fā)生。
例如,以下if語(yǔ)句用于遞增一個(gè)秒表的秒針(暫時(shí)忽略分鐘)。如果seconds的值是59,就重置為0;否則就使用操作符++來(lái)遞增:
int seconds;
...
if (seconds == 59)
seconds = 0;
else
seconds++;
只使用布爾表達(dá)式!
if語(yǔ)句中的表達(dá)式必須放在一對(duì)圓括號(hào)中。除此之外,表達(dá)式必須是布爾表達(dá)式。在另一些語(yǔ)言中(尤其是C和C++),還可以使用一個(gè)整數(shù)表達(dá)式,編譯器能自動(dòng)將整數(shù)值轉(zhuǎn)換成true(非零值)或false(零值)。C#不允許這樣做。如果寫(xiě)這樣的一個(gè)表達(dá)式,編譯器會(huì)報(bào)錯(cuò)。
假如在if語(yǔ)句中不慎寫(xiě)了一個(gè)賦值表達(dá)式,而不是執(zhí)行一個(gè)相等性測(cè)試,C#編譯器也能識(shí)別你的錯(cuò)誤。例如:
int seconds;
...
if (seconds = 59) // 編譯時(shí)錯(cuò)誤
...
if (seconds == 59) // 正確
不慎而寫(xiě)成賦值表達(dá)式,是C和C++程序容易出現(xiàn)bug的另一個(gè)原因。在C和C++中,會(huì)將所賦的值(59)悄悄地轉(zhuǎn)換成一個(gè)布爾值(任何非零的值都會(huì)被視為true),造成每次都必定執(zhí)行if語(yǔ)句之后的代碼。
最后,可以將一個(gè)布爾變量作為表達(dá)式使用,如下例所示:
bool inWord;
...
if (inWord == true) // 可以,但不常用
...
if (inWord) // 更好
使用塊來(lái)分組語(yǔ)句
有時(shí),需要在一個(gè)布爾表達(dá)式為true的前提下運(yùn)行兩個(gè)或者更多的語(yǔ)句??梢詫⒁\(yùn)行的語(yǔ)句分組到一個(gè)新方法中,然后調(diào)用那個(gè)方法。但是,一個(gè)更簡(jiǎn)單的做法是將語(yǔ)句分組到一個(gè)塊(block)中。塊是指用一對(duì)大括號(hào)來(lái)封閉的一系列語(yǔ)句。在下例中,兩個(gè)語(yǔ)句將seconds變量重置為零,并使minutes變量遞增。我們用一個(gè)塊來(lái)分組這兩個(gè)語(yǔ)句。假如seconds的值等于59,就執(zhí)行該塊:
int seconds = 0;
int minutes = 0;
...
if (seconds == 59)
{
seconds = 0;
minutes++;
}
else
seconds++;
重要提示 假如遺漏大括號(hào),將造成兩個(gè)嚴(yán)重后果。首先,C#編譯器只將第一個(gè)語(yǔ)句(seconds=0)與if語(yǔ)句關(guān)聯(lián)起來(lái),下一個(gè)語(yǔ)句(minutes++)將不再成為if語(yǔ)句的一部分。其次,當(dāng)編譯器遇到else關(guān)鍵字時(shí),不會(huì)將它與前一個(gè)if語(yǔ)句關(guān)聯(lián)起來(lái),所以會(huì)報(bào)告語(yǔ)法錯(cuò)誤。