參考資料:高教版《全國計算機等級考試二級教程——C語言程序設(shè)計》茬祷、《21天學通C語言》
關(guān)系運算和邏輯運算
C語言的邏輯值
在C語言中壁榕,用非0表示“真”间涵,用0表示“假”法竞。
關(guān)系運算符和關(guān)系表達式
所謂關(guān)系運算實際上是“比較運算”赋焕,即進行兩個數(shù)的比較参歹,判斷比較的結(jié)果是否符合指定的條件。
C語言的關(guān)系運算符
C語言提供了6種關(guān)系運算符隆判,它們分別是:
- <(小于)
- <=(小于或等于)
- > (大于)
- >=(大于或等于)
- ==(等于)
- !=(不等于)
注意:由兩個字符組成的運算符之間不能有空格犬庇。
關(guān)系運算符是雙目運算符,并且具有自左至右的結(jié)合性侨嘀。
關(guān)系表達式及關(guān)系表達式的值
由關(guān)系運算符構(gòu)成的表達式臭挽,稱為關(guān)系表達式。關(guān)系表達式的計算結(jié)果為“邏輯值”咬腕,只有兩種可能:真(1)或假(0)欢峰。
邏輯運算符和邏輯表達式
C語言的邏輯運算符
C語言提供了3種邏輯運算符,分別是:
- &&(與)
- ||(或)
- U枪病(非)
其中纽帖,&&和||為雙目運算符,煞赢!為單目運算符并且出現(xiàn)在對象的左邊抛计。
邏輯表達式和邏輯表達式的值
由邏輯運算符和運算對象組成的表達式稱為邏輯表達式。邏輯運算的對象可以是C語言中任意合法的表達式照筑。
如果表達式中使用了邏輯運算符吹截,那么該表達式的計算結(jié)果取決于其運算對象。邏輯表達式的運算結(jié)果或者為1(真)凝危,或者為0(假)波俄。
當a和b為任意合法表達式時,邏輯運算規(guī)則如下表:
表達式 | 計算結(jié)果 |
---|---|
a&&b | 當且僅當a與b都為真時蛾默,表達式為真(1)懦铺;否則表達式為假(0)。 |
a||b | a和b有一個為真支鸡,表達式為真(1)冬念;a和b都為假趁窃,表達式為假(0)。 |
!a | 如果a為真急前,表達式為真(0)醒陆;如果a為假,表達式為假(1)裆针。 |
if語句和用if語句構(gòu)成的選擇結(jié)構(gòu)
if語句
if語句的基本格式是刨摩,對表達式求職并根據(jù)求值結(jié)果命令程序執(zhí)行特定內(nèi)容。if語句的格式如下:
if (表達式)
語句
如果表達式為真世吨,就執(zhí)行語句澡刹;如果表達式為假,則不執(zhí)行語句耘婚“战剑可以認為,是否執(zhí)行語句取決于表達式的結(jié)果边篮。
通過使用復合語句或塊己莺,if語句可以控制多條語句的執(zhí)行。
else子句
if語句可以包含else子句戈轿,方法如下:
if (表達式)
語句1凌受;
else
語句2;
如果表達式計算結(jié)果為真思杯,則執(zhí)行語句1胜蛉。如果表達式計算結(jié)果為假,控制將轉(zhuǎn)到else語句色乾,執(zhí)行語句2誊册。語句1和語句2都可以是復合語句或塊。
關(guān)于if語句的說明
- if后面圓括號中的表達式暖璧,可以是任意合法的C語言表達式(如:邏輯表達式案怯、關(guān)系表達式、算術(shù)表達式澎办、賦值表達式等)嘲碱,也可以是任意類型的數(shù)據(jù)(如:整型、實型局蚀、字符型麦锯、指針型等)。
- 無論是否有else子句琅绅,if子句中如果只有一條語句扶欣,則此語句后的分號不能省略。
嵌套的if語句
內(nèi)嵌的if語句既可以嵌套在if子句中,也可以嵌套在else子句中料祠。
在if子句中嵌套具有else子句的if語句
if (表達式1)
if (表達式2)
語句1
else
語句2
else
語句3
當表達式1的值非0時骆捧,執(zhí)行內(nèi)嵌的if-else語句;當表達式1的值為0時术陶,執(zhí)行語句3凑懂。
在if子句中嵌套不含else子句的if語句
if (表達式1)
{
if (表達式2)
語句1
}
else
語句2
注意:在if子句中的一對花括號不可缺少。因為C語言的語法規(guī)定:else子句總是與前面最近的不帶else子句的if相結(jié)合梧宫,與書寫格式無關(guān)。
在else子句中嵌套if語句
語句形式1:內(nèi)嵌的if語句帶有else子句:
if (表達式1)
語句1
else if (表達式2)
語句2
else
語句3
語句形式2:內(nèi)嵌的if語句不帶else子句:
if (表達式1)
語句1
else if (表達式2)
語句2
條件表達式構(gòu)成的選擇結(jié)構(gòu)
條件運算符
條件運算符由兩個運算符組成摆碉,它們是"?"和“:”塘匣。條件運算符是C語言唯一的三元運算符,這意味著需要3個運算對象巷帝。
由條件運算符構(gòu)成的條件表達式
條件表達式的形式如下:
表達式1 忌卤? 表達式2 : 表達式3
條件表達式的運算功能
當表達式1的值為非0時,求出表達式2的值楞泼,此時表達式2的值就是整個條件表達式的值驰徊。
當表達式1的值為0時,則求表達式3的值堕阔,這時表達式3的值為整個條件表達式的值棍厂。
switch語句以及用switch語句和break語句構(gòu)成的選擇結(jié)構(gòu)
switch語句
switch語句形式如下:
switch (表達式)
{
case 常量表達式1:
語句1
case 常量表達式2:
語句2
…
case 常量表達式n:
語句n
default:
語句n+1
}
說明:
- switch是C語言的關(guān)鍵字,switch后用花括號括起來的部分稱為switch語句體超陆。
- 緊跟在switch后一對圓括號中的表達式可以是整型表達式及字符型表達式等牺弹。
- case也是關(guān)鍵字,與其后面的常量表達式合稱case語句標號时呀。常量表達式的類型必須與switch后圓括號中的表達式類型相同张漂,各case語句標號的值應(yīng)該互不相同。
- default也是關(guān)鍵字谨娜,起標號的作用航攒,代表所有case標號之外的那些標號。default標號可以出現(xiàn)在語句體中任何標號位置上趴梢。在switch語句體中也可以沒有default標號漠畜。
- case語句標號后的語句1,語句2等垢油,可以是一條語句盆驹,也可以是若干條語句。
- 必要時滩愁,case語句標號后的語句可以省略不寫躯喇。
- 在關(guān)鍵字case和常量表達式之間一定要有空格。
switch語句的執(zhí)行過程
switch語句對表達式求值,并與每個case標簽后的常量表達式作比較廉丽,會出現(xiàn)下面的情況之一:
- 如果找到與表達式匹配的常量表達式倦微,程序?qū)⑻D(zhuǎn)執(zhí)行case標簽后面的語句。
- 如果沒有匹配的常量表達式正压,程序?qū)⑻D(zhuǎn)執(zhí)行default標簽(可選)后面的語句欣福。
- 如果沒有匹配的常量表達式,也沒有default標簽焦履,程序?qū)⑻^switch語句體拓劝,去執(zhí)行switch語句之后的語句。
程序舉例:
#include <stdio.h>
int main ( void )
{
int reply;
puts ("Enter a number between 1 and 5:");
scanf ("%d", &reply);
switch (reply)
{
case 0:
break;
case 1:
puts("You entered 1.");
case 2:
puts("You entered 2.");
case 3:
puts("You entered 3.");
case 4:
puts("You entered 4.");
case 5:
puts("You entered 5.");
default:
puts("Out of range, try again.");
}
return 0;
}
假設(shè)輸入2嘉裤,那么輸出為:
Enter a number between 1 and 5:
2
You entered 2.
You entered 3.
You entered 4.
You entered 5.
Out of range, try again.
看上去雖然switch語句找到了第一個匹配的常量表達式郑临,然后卻執(zhí)行了后面的所有語句(并非只執(zhí)行匹配的語句)。情況確實如此屑宠,事實上厢洞,switch語句執(zhí)行了下面要講的goto語句來匹配常量表達式。為確保只執(zhí)行與匹配常量表達式相關(guān)的語句典奉,還需要包含break語句躺翻。
在switch語句體中使用break語句
berak為C語言關(guān)鍵字,berak語句又稱間斷語句卫玖」悖可以將break語句放在case標號之后的任何位置,通常是case之后的語句最后加上break語句骇笔。每當執(zhí)行到break語句時省店,立即跳出switch語句體。
利用break語句修改上面的程序:
#include <stdio.h>
int main ( void )
{
int reply;
puts ("Enter a number between 1 and 5:");
scanf ("%d", &reply);
switch (reply)
{
case 1:
{
puts("You entered 1.");
break;
}
case 2:
{
puts("You entered 2.");
break;
}
case 3:
{
puts("You entered 3.");
break;
}
case 4:
{
puts("You entered 4.");
break;
}
case 5:
{
puts("You entered 5.");
break;
}
default:
{
puts("Out of range, try again.");
break;
}
}
return 0;
}
假設(shè)輸入2笨触,那么輸出為:
Enter a number between 1 and 5:
2
You entered 2.
語句標號和goto語句
語句標號
在C語言中懦傍,語句標號不必特意加以定義,標號可以是任意合法的標識符芦劣,當在標識符后面加一個冒號粗俱,如:flag1:、stop0:虚吟,該標識符就成了一個語句標號寸认。
注意:在C語言中,語句標號必須是標識符串慰,因此不能簡單地使用10:偏塞、15:等形式。標號可以和變量同名邦鲫。
在C語言中灸叼,可以在任何語句前加上語句標號神汹。例如:
stop: printf("End\n");
goto語句
goto語句稱為無條件轉(zhuǎn)向語句。程序執(zhí)行至goto語句時古今,將立即跳轉(zhuǎn)至goto語句指定的位置繼續(xù)執(zhí)行邻耕。
與if語句不同的是氨淌,該語句是無條件的,因為無論情況如何琼腔,程序執(zhí)行到goto語句都會進行跳轉(zhuǎn)富弦。
goto語句的一般形式如下:
goto 語句標號;
注意:該語句標號必須與goto語句在同一個函數(shù)內(nèi)盗蟆。
運算符優(yōu)先級歸納
注:表中同一行的運算符優(yōu)先級相同虫埂。
優(yōu)先級 | 運算符 |
---|---|
1 | ( )(函數(shù)運算符) [ ](數(shù)組運算符) -> |
2 | ! ~ ++ -- *(間接運算符) &(取址運算符) sizeof +(一元) -(一元) |
3 | *(乘法) / % |
4 | +(二元) -(二元) |
5 | >> << |
6 | < <= > >= |
7 | == != |
8 | &(按位與) |
9 | ^ |
10 | \ |
11 | && |
12 | \ |
13 | 贷盲?: |
14 | = += -= *= /= &= ^= |= <<= >>= |
15 | , |