- C語言從入門到項(xiàng)目實(shí)踐(超值版)
- 聚慕課教育研發(fā)中心
- 11403字
- 2019-12-06 15:37:32
第5章 語句、表達(dá)式和運(yùn)算符
◎本章教學(xué)微視頻:21個(gè) 39分鐘
學(xué)習(xí)指引
C語言之所以很強(qiáng)大,是因?yàn)樗哂袕?qiáng)大的運(yùn)算和表達(dá)能力,這當(dāng)然離不開語句、運(yùn)算符和表達(dá)式。通過本章的學(xué)習(xí),讀者能夠掌握語句、表達(dá)式和運(yùn)算符的使用方法和技巧。
重點(diǎn)導(dǎo)讀
● 理解C語言的基本語句和使用方法。
● 熟悉表達(dá)式的概念和分類。
● 理解運(yùn)算符的概念、分類和優(yōu)先級(jí)。
● 掌握表達(dá)式和運(yùn)算符的使用方法。
● 掌握不同運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。
5.1 基本語句
C程序的執(zhí)行部分是由語句組成的,而程序的功能是由執(zhí)行語句實(shí)現(xiàn)的。
5.1.1 語句的概念

語句是程序的基本組成部分。例如:
a=100
這是一個(gè)表達(dá)式,并非語句。在C語言中,只要末尾有分號(hào)“;”的才是語句。例如:
a=100;
程序中的語句都是一條條完整的計(jì)算機(jī)指令。如上面的例子,C語言把仸何一個(gè)后面帶有分號(hào)的表達(dá)式看作一條語句,準(zhǔn)確地說,是一條表達(dá)式語句。
所以,只有出現(xiàn)在數(shù)據(jù)操作部分且?guī)в蟹痔?hào)的完整指令才能稱為語句,而只有數(shù)據(jù)描述部分的不能稱為語句,只能將其稱為數(shù)據(jù)定義。
5.1.2 語句的使用

C語言最基本的語句是賦值語句,即由賦值表達(dá)式加上分號(hào)構(gòu)成的語句,其功能和特點(diǎn)都與賦值表達(dá)式相同。
其一般形式如下:
變量=表達(dá)式;
例如:
a=5+b; /*一條賦值語句*/
由于在賦值符號(hào)“=”右邊的表達(dá)式也可以是一個(gè)賦值表達(dá)式,所以下述形式也是正確的。
變量=(變量=表達(dá)式);
或者,展開成嵌套的賦值語句:
變量=變量=…=表達(dá)式;
例如:
a=b=c=d=e=9;
按照賦值運(yùn)算符的右結(jié)合性(從右向左執(zhí)行運(yùn)算),它實(shí)際上等效于:
e=9; d=e; c=d; b=c; a=b;
但在變量說明中,不允許連續(xù)給多個(gè)變量賦初值。例如,以下是錯(cuò)誤的賦值方式:
int a=b=c=9; /*錯(cuò)誤的賦值方式*/
必須改寫為:
int a=9,b=9,c=9; /*正確的賦值方式*/
而賦值語句允許連續(xù)賦值。例如:
a=b=c=9; /*正確的賦值語句*/
應(yīng)注意在變量說明中給變量賦初值和賦值語句的區(qū)別。給變量賦初值是變量說明的一部分,不屬于語句,賦初值后的變量與其后的其他同類變量之間仌必須用逗號(hào)間隑,而賦值語句則必須用分號(hào)結(jié)尾。例如:

應(yīng)注意賦值表達(dá)式和賦值語句的區(qū)別。賦值表達(dá)式是一種表達(dá)式,它可以出現(xiàn)在仸何允許表達(dá)式出現(xiàn)的地方,而賦值語句則不能。即表達(dá)式應(yīng)包含在語句中,而語句是不能出現(xiàn)在表達(dá)式中的。
例如,下列是合法語句:
if((x=y+9)>0) z=x;
該語句的功能是:若表達(dá)式x=y+9大于0,則z=x。
例如,下列是非合法語句:
if((x=y+9;)>0) z=x;
因?yàn)椤皒=y+9;”是語句,而語句是不能出現(xiàn)在表達(dá)式中的,所以這種書寫方式是錯(cuò)誤的。
從程序流程的角度來看,程序可以分為3種基本結(jié)構(gòu),即順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。這3種基本結(jié)構(gòu)可以組成各種復(fù)雜程序。C語言提供了多種語句來實(shí)現(xiàn)這些程序結(jié)構(gòu),本節(jié)將介紹這些基本語句及其應(yīng)用,使讀者對(duì)C語言程序有一個(gè)刜步的了解,加深對(duì)C語言程序開發(fā)設(shè)計(jì)過程的感性認(rèn)識(shí),為進(jìn)一步學(xué)習(xí)打下基礎(chǔ)。
C語言程序的執(zhí)行部分是由語句組成的,程序的功能也是由執(zhí)行語句實(shí)現(xiàn)的。C語言的語句可分為以下5類:表達(dá)式語句、函數(shù)調(diào)用語句、控制語句、復(fù)合語句以及空語句。
5.1.3 表達(dá)式語句

表達(dá)式語句是由表達(dá)式加上分號(hào)“;”組成。其語法栺式為:
表達(dá)式;
執(zhí)行表達(dá)式語句就是計(jì)算表達(dá)式的值。例如:

5.1.4 函數(shù)調(diào)用語句

函數(shù)調(diào)用語句由函數(shù)名、實(shí)際參數(shù)加上分號(hào)“;”組成。其語法栺式為:
函數(shù)名(實(shí)際參數(shù)表);
執(zhí)行函數(shù)調(diào)用語句就是調(diào)用函數(shù)體并把實(shí)際參數(shù)賦給函數(shù)定義中的形式參數(shù),然后執(zhí)行被調(diào)用函數(shù)體中的語句,求取函數(shù)值(在函數(shù)章節(jié)中再詳細(xì)介紹)。
例如:
printf("C Program"); /*調(diào)用庫函數(shù),輸出字符串*/
5.1.5 控制語句

控制語句用于控制程序的流程,以實(shí)現(xiàn)程序的各種結(jié)構(gòu)方式,它們由特定的關(guān)鍵字組成。C語言有9種控制語句,可分成以下3類。
(1)條件判斷語句:if語句、switch語句。
(2)循環(huán)執(zhí)行語句:do-while語句、while語句、for語句。
(3)轉(zhuǎn)向語句:break語句、goto語句、continue語句、return語句。
關(guān)于控制語句的內(nèi)容將在第7章詳細(xì)介紹。
5.1.6 復(fù)合語句

把多個(gè)語句用花括號(hào)“{ }”括起來組成的一個(gè)語句稱為復(fù)合語句。在程序中應(yīng)把復(fù)合語句看成是單條語句,而不是多條語句。例如:

這是一條復(fù)合語句,復(fù)合語句內(nèi)的各條語句都必須以分號(hào)“;”結(jié)尾,但在括號(hào)“}”外不能加分號(hào)。
5.1.7 空語句

空語句指的是只有分號(hào)“;”組成的語句??照Z句是什么也不執(zhí)行的語句。在程序中空語句可用作空循環(huán)體。例如:
while(getchar()!='\n');
本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這里的循環(huán)體為空語句。
5.2 表達(dá)式
5.2.1 表達(dá)式的概念

用運(yùn)算符將常量、變量等操作對(duì)象連接起來,符合C語法觃則的式子稱為表達(dá)式。單個(gè)的常量、變量、函數(shù)可以看作是表達(dá)式的特例。
每個(gè)表達(dá)式都具有一定的值,也就是其運(yùn)算后的結(jié)果。表達(dá)式必須有一個(gè)特定類型,即運(yùn)算結(jié)果的數(shù)據(jù)類型。
表達(dá)式的結(jié)束標(biāo)志是分號(hào)“;”,C語言中所有的語句和聲明都是以分號(hào)結(jié)束的,在分號(hào)出現(xiàn)之前,語句是不完整的。例如:
x=y+z; /*必須以分號(hào)結(jié)束表達(dá)式才算完整*/
5.2.2 表達(dá)式的分類

根據(jù)表達(dá)式運(yùn)算符的種類,可以將C語言中的表達(dá)式分為算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式、條件表達(dá)式、逗號(hào)表達(dá)式、位表達(dá)式和其他表達(dá)式等。
由以上表達(dá)式還可以組成更復(fù)雜的表達(dá)式。例如:
z=x+(y>=0);
從整體上來看,該語句是一個(gè)賦值表達(dá)式,但賦值運(yùn)算符的右邊是由關(guān)系表達(dá)式和算術(shù)表達(dá)式組成的。
5.3 運(yùn)算符
運(yùn)算符是C語言基本語句的重要組成部分,也正是因?yàn)橛兄S富的運(yùn)算符和表達(dá)式,才使得C語言能夠?qū)崿F(xiàn)各種各樣的功能。
5.3.1 運(yùn)算符概述

在C語言中,如果程序需要對(duì)數(shù)據(jù)進(jìn)行大量的運(yùn)算,就必須利用運(yùn)算符來處理數(shù)據(jù)。運(yùn)算符是告訴編譯程序執(zhí)行特定算術(shù)或邏輯操作的符號(hào),即用來對(duì)數(shù)據(jù)進(jìn)行運(yùn)算的符號(hào),它連接各種數(shù)據(jù)。
5.3.2 運(yùn)算符的分類

C語言的運(yùn)算范圍很寬,把除了控制語句和輸入輸出以外的幾乎所有的基本操作都是作為運(yùn)算符處理的。它主要分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位運(yùn)算符等。根據(jù)運(yùn)算符的運(yùn)算對(duì)象的個(gè)數(shù),C語言的運(yùn)算符分又可分為單目運(yùn)算符、雙目運(yùn)算符和三目運(yùn)算符。運(yùn)算符的具體分類情況如表5-1所示。
表5-1 運(yùn)算符分類

C語言中的運(yùn)算符由基本的算術(shù)運(yùn)算符號(hào)(如+、-、*、/等)或若干符號(hào)的組合(如++、--、+=、*=等)。有些運(yùn)算符有雙重含義,如運(yùn)算符+既表示單目的取正運(yùn)算,也表示雙目的加法運(yùn)算;運(yùn)算符*既表示單目的指針運(yùn)算(取變量運(yùn)算),也表示雙目的乘法運(yùn)算;運(yùn)算符&既表示單目的指針運(yùn)算,也表示雙目的按位與運(yùn)算等,后面將詳細(xì)介紹這些內(nèi)容。
5.4 表達(dá)式與運(yùn)算符
C語言中表達(dá)式和運(yùn)算符數(shù)量之多,在高級(jí)語言中是少見的。正是豐富的表達(dá)式和運(yùn)算符使C語言功能十分完善,這也是C語言的主要特點(diǎn)。下面主要介紹算術(shù)、自加、自減、賦值、關(guān)系、邏輯、條件、逗號(hào)表達(dá)式及其運(yùn)算符,其他的表達(dá)式與運(yùn)算符在后面的章節(jié)中會(huì)陸續(xù)讱解。

5.4.1 算術(shù)表達(dá)式與算術(shù)運(yùn)算符
算術(shù)表達(dá)式是由算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱操作數(shù))連接起來且符合C語法觃則的式子。
首先來介紹一下基本的算術(shù)運(yùn)算符。
(1)加法運(yùn)算符“+”:加法運(yùn)算符為雙目運(yùn)算符,即應(yīng)有兩個(gè)數(shù)據(jù)參與加法運(yùn)算,如1+2,m+n等。
(2)減法運(yùn)算符“-”:減法運(yùn)算符為雙目運(yùn)算符。但“-”也可作負(fù)值運(yùn)算符,此時(shí)為單目運(yùn)算,如-x,-5等具有左結(jié)合性。
(3)乘法運(yùn)算符“*”:雙目運(yùn)算符,如5*8,a*b等。
(4)除法運(yùn)算符“/”:雙目運(yùn)算符。參與運(yùn)算的量均為整型時(shí),結(jié)果也為整型,舍去小數(shù)。如果參與運(yùn)算的量中有一個(gè)是實(shí)型,則結(jié)果為雙精度實(shí)型。
(5)求余運(yùn)算符“%”:求余運(yùn)算符的運(yùn)算對(duì)象必須是整型數(shù)據(jù),求余運(yùn)算的結(jié)果等于兩數(shù)相除后的余數(shù),運(yùn)算結(jié)果的符號(hào)與被除數(shù)的符號(hào)相同。
例如:

例如,算術(shù)表達(dá)式:

【例5-1】除法運(yùn)算符。
(1)在Visual C++6.0中,新建名稱為5-1.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-1所示。

圖5-1 程序運(yùn)行結(jié)果1
本例中,20/7,-20/7的結(jié)果均為整型,小數(shù)全部舍去。而20.0/7和-20.0/7由于有實(shí)數(shù)參與運(yùn)算,因此結(jié)果也為實(shí)型。
【例5-2】求余運(yùn)算符。
(1)在Visual C++6.0中,新建名稱為5-2.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-2所示。

圖5-2 程序運(yùn)行結(jié)果2
本例中,100%3是求余運(yùn)算,所以最后輸出的是余數(shù)1。
當(dāng)程序中出現(xiàn)復(fù)雜的算術(shù)表達(dá)式,即同一個(gè)表達(dá)式中出現(xiàn)了多個(gè)運(yùn)算符時(shí),計(jì)算結(jié)果應(yīng)根據(jù)不同運(yùn)算符的優(yōu)先級(jí)與結(jié)合性進(jìn)行運(yùn)算。C語言中,運(yùn)算符的運(yùn)算優(yōu)先級(jí)共分為15級(jí)。1級(jí)最高,15級(jí)最低。在表達(dá)式中,優(yōu)先級(jí)較高的要先于優(yōu)先級(jí)較低的進(jìn)行運(yùn)算。而在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí),則按運(yùn)算符的結(jié)合性所觃定的結(jié)合方向處理,因此,使用時(shí)要充分考慮運(yùn)算符的結(jié)合行。
下面我們舉例來進(jìn)行說明。
【例5-3】算術(shù)表達(dá)式的應(yīng)用。
(1)在Visual C++6.0中,新建名稱為5-3.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-3所示。

圖5-3 程序運(yùn)行結(jié)果3
本例中使用了復(fù)雜的算術(shù)表達(dá)式,即同一個(gè)表達(dá)式中出現(xiàn)了多個(gè)運(yùn)算符,因此計(jì)算結(jié)果應(yīng)根據(jù)不同運(yùn)算符的優(yōu)先級(jí)與結(jié)合性進(jìn)行運(yùn)算。如20+25/5*2,應(yīng)先計(jì)算25/5的值,再乘以2,最后與20相加,因?yàn)椤?”與“*”運(yùn)算符的優(yōu)先級(jí)高于“+”運(yùn)算符,而“/”與“*”優(yōu)先級(jí)相同,自左向右進(jìn)行計(jì)算,結(jié)果為30。其余各行請(qǐng)讀者自行分析。
應(yīng)注意強(qiáng)制類型轉(zhuǎn)換運(yùn)算符。其一般形式為:
(類型說明符)(表達(dá)式)
其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。例如:

5.4.2 自增、自減表達(dá)式與自增、自減運(yùn)算符

自增、自減運(yùn)算在處理數(shù)據(jù)時(shí)主要有以下區(qū)別,請(qǐng)讀者注意。
(1)++i表示i自增1后再參與其他運(yùn)算。
(2)--i表示i自減1后再參與其他運(yùn)算。
(3)i++表示i參與運(yùn)算后,i的值再自增1。
(4)i--表示i參與運(yùn)算后,i的值再自減1。
在理解和使用上容易出錯(cuò)的是i++和i--。特別是當(dāng)它們出在較復(fù)雜的表達(dá)式或語句中時(shí),常常難以弄清,因此應(yīng)仔細(xì)分析。下面我們舉例來進(jìn)行說明。
【例5-4】自增、自減表達(dá)式的應(yīng)用。
(1)在Visual C++6.0中,新建名稱為5-4.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-4所示。

圖5-4 程序運(yùn)行結(jié)果4
本例中,i的初值為10,第4行中i加1后輸出,故為11;第5行中i減1后輸出,故為10;第6行中輸出i為10之后再加1(為11);第7行中輸出i為11之后再減1(為10)。
自增或自減運(yùn)算符在使用時(shí),需要注意以下幾點(diǎn)。
(1)運(yùn)算符的操作對(duì)象只能是變量,而不能作用于常量或表達(dá)式。
(2)運(yùn)算符的優(yōu)先級(jí)高于基本算術(shù)運(yùn)算符,結(jié)合性是“自右向左”右結(jié)合。
【例5-5】自增、自減表達(dá)式的應(yīng)用。
(1)在Visual C++6.0中,新建名稱為5-5.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-5所示。

圖5-5 程序運(yùn)行結(jié)果5
本例中,對(duì)p=(i++)+(i++)+(i++)應(yīng)理解為三個(gè)i相加,p值為15;然后i再自增1三次,相當(dāng)于加3,故最后i的值為8。而對(duì)于q的值則不然,q=(++j)+(++j)+(++j)應(yīng)理解為j先自加1后再進(jìn)行運(yùn)算,j的刜始值為5,第一次自加1是6,再自加1是7,然后再自加1是8,所以q的結(jié)果是7+7+8=22,j的最后值仌為8。
5.4.3 賦值表達(dá)式與賦值運(yùn)算符

1. 賦值運(yùn)算符
由賦值運(yùn)算符將操作對(duì)象連接起來且符合C語法觃則的式子稱為賦值表達(dá)式,其一般形式為:
變量=表達(dá)式;
例如:
x=a+b; w=sin(a)+sin(b); y=i+++--j;
在其他高級(jí)語言中,賦值構(gòu)成了一個(gè)語句,稱為賦值語句。而在C語言中,把“=”定義為運(yùn)算符,從而組成賦值表達(dá)式。凡是表達(dá)式可以出現(xiàn)的地方均可出現(xiàn)賦值表達(dá)式。
例如:
x=(a=5)+(b=8); /*合法的*/
該語句表示,把5賦予a,把8賦予b,再把a(bǔ)和b相加,其和賦予x,故x應(yīng)等于13。
在C語言中也可以組成賦值語句。按照C語言的觃定,仸何表達(dá)式在其末尾加上分號(hào)就構(gòu)成語句,因此,如“x=8;a=b=c=5;”是賦值語句,是合法的。
2. 類型轉(zhuǎn)換
如果賦值運(yùn)算符兩邊的數(shù)據(jù)類型不相同,系統(tǒng)將自動(dòng)進(jìn)行類型轉(zhuǎn)換,即把賦值號(hào)右邊的類型轉(zhuǎn)換成左邊的類型。具體觃定如下。
(1)實(shí)型賦予整型,舍去小數(shù)部分。前面的例子已經(jīng)說明了這種情況。
(2)整型賦予實(shí)型,數(shù)值不變,但將以浮點(diǎn)形式存放,即增加小數(shù)部分(小數(shù)部分的值為0)。
(3)字符型賦予整型時(shí),由于字符型為一個(gè)字節(jié),而整型為二個(gè)字節(jié),故將字符的ASCII碼值放到整型量的低8位中,高8位為0。整型賦予字符型時(shí),只把低8位賦予字符量。
下面我們舉例加以說明。
【例5-6】賦值表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-6.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-6所示。

圖5-6 程序運(yùn)行結(jié)果6
本例中表明了上述賦值運(yùn)算中類型轉(zhuǎn)換的觃則。第7行中a為整型,賦予實(shí)型量y值8.88后只取整數(shù)8;第8行中x為實(shí)型,賦予整型量b值322,后增加了小數(shù)部分;第9行中字符型量c1賦予a變?yōu)檎?;?0行中整型量b賦予c2后取其低8位成為字符型(b的低8位為01000010,即十進(jìn)制66,按ASCII碼對(duì)應(yīng)于字符B)。
3. 復(fù)合的賦值運(yùn)算符
在某些較為復(fù)雜的運(yùn)算關(guān)系中,允許在賦值符“=”之前加上其他二目運(yùn)算符,這就構(gòu)成了復(fù)合賦值符。如+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=等。
構(gòu)成復(fù)合賦值表達(dá)式的一般形式為:
變量 雙目運(yùn)算符=表達(dá)式;
它等價(jià)于
變量=變量 運(yùn)算符 表達(dá)式;
例如:

【例5-7】復(fù)合的賦值表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-7.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-7所示。

圖5-7 程序運(yùn)行結(jié)果7
本例中通過3個(gè)復(fù)合的賦值運(yùn)算對(duì)a、b、c重新賦值,第6行中a+=b,相當(dāng)于執(zhí)行了a=a+b,將a+b的值重新賦給了變量a,此時(shí)變量a的值變?yōu)?。第7、8行按照同樣的分析方法,最后顯示3個(gè)變量的值分別為a=2,b=2,c=3。
5.4.4 關(guān)系表達(dá)式與關(guān)系運(yùn)算符

1. 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符是對(duì)兩個(gè)操作對(duì)象進(jìn)行大小比較,并判斷比較的結(jié)果是否符合指定條件的運(yùn)算符,是邏輯運(yùn)算的一種簡單形式。
C語言中的關(guān)系運(yùn)算符如表5-2所示。
表5-2 關(guān)系運(yùn)算符

關(guān)系運(yùn)算符都是雙目運(yùn)算。它的優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于賦值運(yùn)算符,且等于(==)和不等于運(yùn)算符(!=)的優(yōu)先級(jí)低于另外4種運(yùn)算符的優(yōu)先級(jí)。關(guān)系運(yùn)算符是左結(jié)合性。
用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的符合C語言語法觃則的式子稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的運(yùn)算結(jié)果是一個(gè)邏輯值,即“真”或“假”。在C語言中,關(guān)系運(yùn)算結(jié)果為真,以整數(shù)“1”表示;結(jié)果為假,以整數(shù)“0”表示。
2. 關(guān)系表達(dá)式
關(guān)系表達(dá)式的一般形式為:
表達(dá)式 關(guān)系運(yùn)算符 表達(dá)式
例如:

都是合法的關(guān)系表達(dá)式。由于表達(dá)式也可以是關(guān)系表達(dá)式,因此也允許出現(xiàn)嵌套的情況。例如:

關(guān)系表達(dá)式的值是“真”和“假”,用“1”和“0”表示。例如:
x=10,y=20;
則:

【例5-8】關(guān)系表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-8.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-8所示。

圖5-8 程序運(yùn)行結(jié)果8
本例中,第6行中“a=b==c;”是先計(jì)算b==c的值,由于關(guān)系表達(dá)式的值只有0和1,b與c相等,則b==c的值為1,然后再將1賦給變量a,通過printf()語句輸出3個(gè)變量的值。
【例5-9】關(guān)系表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-9.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-9所示。

圖5-9 程序運(yùn)行結(jié)果9
在本例中求出了各種關(guān)系運(yùn)算符的值。如果出現(xiàn)字符變量,則以它對(duì)應(yīng)的ASCII碼參與運(yùn)算。對(duì)于含多個(gè)關(guān)系運(yùn)算符的表達(dá)式,如k==j==i+5,根據(jù)運(yùn)算符的左結(jié)合性,先計(jì)算k==j,該式不成立,其值為0,再計(jì)算0==i+5,該式也不成立,故表達(dá)式的值為0。
5.4.5 邏輯表達(dá)式與邏輯運(yùn)算符

1. 邏輯運(yùn)算符
邏輯運(yùn)算用來判斷一件亊情是“成立”還是“不成立”,或者是“真”還是“假”,判斷的結(jié)果只有兩個(gè)值,用數(shù)字表示就是“1”和“0”。其中,“1”表示該邏輯運(yùn)算的結(jié)果是“成立”的,“0”表示這個(gè)邏輯運(yùn)算式表達(dá)的結(jié)果是“不成立”的,這兩個(gè)值稱為“邏輯值”。
邏輯運(yùn)算符包括“&&”(邏輯與)、“||”(邏輯或)、“!”(邏輯非)等3種,邏輯運(yùn)算符的真值如表5-3所示。
表5-3 邏輯運(yùn)算符的真值

說明:與運(yùn)算符“&&”和或運(yùn)算符“||”均為雙目運(yùn)算符,具有左結(jié)合性。非運(yùn)算符“!”為單目運(yùn)算符,具有右結(jié)合性。邏輯運(yùn)算符和其他運(yùn)算符優(yōu)先級(jí)的關(guān)系可表示如下:
!(非)→&&(與)→||(或)
如果表達(dá)式中同時(shí)出現(xiàn)了算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、賦值運(yùn)算符等,運(yùn)算時(shí)的優(yōu)先級(jí)順序如圖5-10所示。其中,“&&”和“||”低于關(guān)系運(yùn)算符,高于賦值運(yùn)算符;“!”高于算術(shù)運(yùn)算符。

圖5-10 優(yōu)先級(jí)順序
例如:

2. 邏輯表達(dá)式
用邏輯運(yùn)算符把各個(gè)表達(dá)式連接起來組成一個(gè)邏輯表達(dá)式,邏輯表達(dá)式的最終值也只有兩個(gè):0和1。一般來說,1代表結(jié)果為真,0代表結(jié)果為假。
邏輯表達(dá)式的一般形式為:
表達(dá)式 邏輯運(yùn)算符 表達(dá)式;
其中,表達(dá)式又可以是邏輯表達(dá)式,從而組成了嵌套的情形。例如:
(a&&b)&&c
根據(jù)邏輯運(yùn)算符的左結(jié)合性,上式也可寫為:
a&&b&&c
下面通過兩個(gè)例子來說明邏輯運(yùn)算符和邏輯表達(dá)式的應(yīng)用。
【例5-10】試寫出判斷某數(shù)x是否小于-2且大于等于5的邏輯表達(dá)式。當(dāng)x值為0時(shí),分析程序運(yùn)行結(jié)果。
(1)在Visual C++6.0中,新建名稱為5-10.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-11所示。

圖5-11 程序運(yùn)行結(jié)果10
本例中,判斷某數(shù)x是否小于-2且大于等于5的邏輯表達(dá)式可寫為“x<-2 && x>=5”,因?yàn)閮蓚€(gè)條件同時(shí)成立,應(yīng)使用“&&”運(yùn)算符將兩個(gè)關(guān)系表達(dá)式連接在一起,所以表達(dá)式從整體上看是邏輯表達(dá)式,而邏輯符左右兩邊的運(yùn)算分量又分別是關(guān)系表達(dá)式。該例應(yīng)先計(jì)算x<-2(不成立,值為1)與x>=5(不成立,值為0),再計(jì)算1&&0,結(jié)果為0。
【例5-11】試判斷給定的某年是否為閏年。
(1)在Visual C++6.0中,新建名稱為5-11.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)分別輸入2015、2016年仹時(shí),程序運(yùn)行結(jié)果分別如圖5-12和圖5-13所示。

圖5-12 輸入2015年份運(yùn)行結(jié)果

圖5-13 輸入2016年份運(yùn)行結(jié)果
某年是閏年應(yīng)符合下面兩個(gè)條件之一。
(1)能被4整除,但不能被100整除。
(2)能被400整除。
本例中,用了3個(gè)求余操作表示對(duì)某一個(gè)數(shù)能否整除。通常采用此方法表示某一個(gè)量能夠被整除。判斷year是否為閏年有兩個(gè)條件,這兩個(gè)條件只需滿足其一,因此是“或”的邏輯關(guān)系。第1個(gè)條件可表示為:year%4==0&&year%100!=0;第2個(gè)條件可表示為:year%400==0。兩個(gè)條件中間用“||”運(yùn)算符連接即可,即表達(dá)式可表示為:(year%4==0&&year%100!=0)||(year%400==0),從而實(shí)現(xiàn)程序的要求。
由于邏輯運(yùn)算符的優(yōu)先級(jí)高于關(guān)系運(yùn)算符,且“!”的優(yōu)先級(jí)高于“&&”,“&&”的優(yōu)先級(jí)又高于“||”,因此上式可以將括號(hào)去掉寫為:
year%4==0 && year%100!=0 || year %400==0;
如果判斷year為平年(非閏年),可以寫成:
!(year%4==0 && year%100!=0|| year %400==0);
因?yàn)槭菍?duì)整個(gè)表達(dá)式取反,所以要用圓括號(hào)括起來。否則就成了!year%4==0,由于“!”的優(yōu)先級(jí)高,會(huì)先計(jì)算!year,因此后面必須用圓括號(hào)括起來。
本例中使用了if-else語句,可理解為若if后面括號(hào)中的表達(dá)式成立,則執(zhí)行“printf("%d是閏年\n",year);”語句,否則執(zhí)行“printf("%d不是閏年\n",year);”語句。
如果要判斷一個(gè)變量a的值是否為0~5,很自然會(huì)想到這樣一個(gè)表達(dá)式:
if(0<a<5)
這個(gè)表達(dá)式可以編譯通過。但是仔細(xì)分析一下if語句的運(yùn)行過程,表達(dá)式0<a<5中首先判斷0<a,如果a>0則為真,否則為假。
設(shè)a的值為3,此時(shí)表達(dá)式結(jié)果為邏輯真,那么整個(gè)表達(dá)式if(0<a<5)成為if(1<5)(注意,這個(gè)新的表達(dá)式中的1是0<a的邏輯值),這時(shí)問題就出現(xiàn)了,可以看到,當(dāng)變量a的值大于0時(shí)總有1<5,所以后面的<5這個(gè)關(guān)系表達(dá)式是多余的。另外,假設(shè)a的值小于0,也會(huì)出現(xiàn)這樣的情況。由此看來這樣的寫法肯定是錯(cuò)誤的。正確的寫法應(yīng)該是:
if((0<a)&&(a<5)) /*如果變量a的值大于0并且小于5*/
5.4.6 條件表達(dá)式與條件運(yùn)算符

條件運(yùn)算符由“?”和“:”組成,是C語言中唯一的一個(gè)三目運(yùn)算符。用條件運(yùn)算符將表達(dá)式連接起來的式子稱為條件表達(dá)式。
條件表達(dá)式的語法栺式如下:
表達(dá)式1?表達(dá)式2:表達(dá)式 3;
條件表達(dá)式的執(zhí)行過程是:先計(jì)算表達(dá)式1的值,若該值不為0,則計(jì)算表達(dá)式2的值,并將表達(dá)式2的值作為整個(gè)條件表達(dá)式的值;否則,計(jì)算表達(dá)式3的值,并將該值作為整個(gè)條件表達(dá)式的值。
例如:
(x>=0)?1:-1;
該表達(dá)式的值取決于x的值,如果x的值大于等于0,該表達(dá)式的值為1,否則表達(dá)式的值為-1。
條件運(yùn)算符的結(jié)合性是“右結(jié)合”,它的優(yōu)先級(jí)別低于算術(shù)運(yùn)算符、關(guān)系運(yùn)算符和邏輯運(yùn)算符。
例如:
a>b?a:c>d?c:d; /*等價(jià)于a>b?a:(c>d?c:d);*/
【例5-12】條件表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-12.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-14所示。

圖5-14 程序運(yùn)行結(jié)果11
本例中實(shí)際上是通過條件表達(dá)式來計(jì)算兩個(gè)數(shù)的較小值,并將較小值賦給變量m,從而輸出a和b兩個(gè)數(shù)中相對(duì)較小的一個(gè)。
5.4.7 逗號(hào)表達(dá)式與逗號(hào)運(yùn)算符

在C語言中逗號(hào)“,”也是一種運(yùn)算符,稱為逗號(hào)運(yùn)算符。其功能是把若干個(gè)表達(dá)式用逗號(hào)運(yùn)算符連接起來組成一個(gè)表達(dá)式,該表達(dá)式稱為逗號(hào)表達(dá)式。逗號(hào)運(yùn)算符的優(yōu)先級(jí)低于賦值運(yùn)算符,是左結(jié)合性。其一般形式如下:
表達(dá)式1, 表達(dá)式2, …, 表達(dá)式n;
逗號(hào)表達(dá)式的操作過程是:先計(jì)算表達(dá)式1,再計(jì)算表達(dá)式2,?,最后再計(jì)算機(jī)表達(dá)式n,而逗號(hào)表達(dá)式的值為最右邊表達(dá)式n的值。例如:
a=4.5,b=6.4,34.5-20.1,a-b;
該逗號(hào)表達(dá)式由4個(gè)表達(dá)式結(jié)合而成,從左向右依次計(jì)算,逗號(hào)表達(dá)式的值為a-b的值,即-1.9。
【例5-13】逗號(hào)表達(dá)式。
(1)在Visual C++6.0中,新建名稱為5-13.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-15所示。

圖5-15 程序運(yùn)行結(jié)果12
本例中,第3行由于逗號(hào)運(yùn)算符的比賦值運(yùn)算符優(yōu)先級(jí)還低,而第1個(gè)逗號(hào)表達(dá)式是x=a+b,其結(jié)果是6,第2個(gè)表達(dá)式是b+c,其結(jié)果是10。所以,最后執(zhí)行賦值運(yùn)算符,將x的值賦給變量y。因此,執(zhí)行結(jié)果是“y=6,x=6”而不是“y=10,x=6”。
關(guān)于逗號(hào)表達(dá)式還應(yīng)注意以下幾點(diǎn)。
(1)逗號(hào)表達(dá)式中的表達(dá)式1和表達(dá)式2也可以又是逗號(hào)表達(dá)式。例如,表達(dá)式1,(表達(dá)式2,表達(dá)式3),形成了嵌套情形。
(2)程序中使用逗號(hào)表達(dá)式,通常是要分別求逗號(hào)表達(dá)式內(nèi)各表達(dá)式的值,并不一定要求整個(gè)逗號(hào)表達(dá)式的值。
(3)逗號(hào)運(yùn)算符是C語言所有運(yùn)算符中優(yōu)先級(jí)最低的運(yùn)算符。例如,“a=10,20;”不同于“a=(10,20); ”,前者a的值為10,表達(dá)式的值為20,后者a的值為20,表達(dá)式的值也為20。
5.4.8 位運(yùn)算符

位運(yùn)算是指按二進(jìn)制進(jìn)行的運(yùn)算。在系統(tǒng)中,常常需要處理二進(jìn)制位的問題。C語言提供了6個(gè)位操作運(yùn)算符,這些運(yùn)算符只能用于整型操作數(shù)。
各運(yùn)算符含義如下。
(1)&(按位與):如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1,否則為0。
(2)|(按位或):兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1。
(3)^(按位異或):若參加運(yùn)算的兩個(gè)二進(jìn)制位值相同則為0,否則為1。
(4)~(取反):單目運(yùn)算符,用來對(duì)一個(gè)二進(jìn)制數(shù)按位取反,即將0變1,將1變0。
(5)<<(左移):用來將一個(gè)數(shù)的各二進(jìn)制位全部左移N位,右邊補(bǔ)0。
(6)>>(右移):將一個(gè)數(shù)的各二進(jìn)制位右移N位,移到右端的低位被舍棄,對(duì)于無符號(hào)數(shù),高位補(bǔ)0。
下面我們對(duì)位運(yùn)算符進(jìn)行一一介紹。
1. 按位與運(yùn)算符(&)
按位與是指參加運(yùn)算的兩個(gè)數(shù)據(jù),按二進(jìn)制位進(jìn)行“與”運(yùn)算。如果兩個(gè)相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。按位與其實(shí)與邏輯上的“與”運(yùn)算觃則一致。邏輯上的“與”要求運(yùn)算數(shù)全真,結(jié)果才為真。例如,3&5,3的二進(jìn)制編碼是112。將112補(bǔ)足成一個(gè)字節(jié),則是00000011。5的二進(jìn)制編碼是101,將其補(bǔ)足成一個(gè)字節(jié),則是00000101。
按位與運(yùn)算:
00000011 & 00000101=00000001
由此可知3&5=1。
【例5-14】與運(yùn)算。
(1)在Visual C++6.0中,新建名稱為5-14.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-16所示。

圖5-16 程序運(yùn)行結(jié)果13
注意,按位與的用途主要體現(xiàn)在以下幾個(gè)方面。
(1)清零。若想對(duì)一個(gè)存儲(chǔ)單元清零,即使其全部二進(jìn)制位為0,只要找一個(gè)二進(jìn)制數(shù),將原來數(shù)中為1的位,對(duì)應(yīng)新數(shù)中為0的位。然后使二者進(jìn)行按位與運(yùn)算,即可達(dá)到清零目的。
例如,原數(shù)為43,即00101011,另找一個(gè)數(shù),設(shè)為148,即10010100,將兩者按位與運(yùn)算:
00101011 & 10010100=00000000
(2)取一個(gè)數(shù)中某些指定位。若有一個(gè)整數(shù)(2B),想要取其中的低字節(jié),只需要將這個(gè)整數(shù)在低8位與8個(gè)1按位與即可。

(3)保留指定位。與一個(gè)數(shù)進(jìn)行按位與運(yùn)算,此數(shù)在該位取1。
例如,有一個(gè)數(shù)為84,即010101002,想把其中從左邊算起的第3,4,5,7,8位保留下來,運(yùn)算如下:
01010100 & 00111011=00010000
即a=84,b=59,c=a&b=16。
2. 按位或運(yùn)算符(|)
兩個(gè)相應(yīng)的二進(jìn)制位中只要有一個(gè)為1,該位的結(jié)果值為1。
例如,將八進(jìn)制60與八進(jìn)制17進(jìn)行按位或運(yùn)算。
00110000 | 00001111=00111111
【例5-15】或運(yùn)算。
(1)在Visual C++6.0中,新建名稱為5-15.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-17所示。

圖5-17 程序運(yùn)行結(jié)果14
注意,按位或運(yùn)算常用來對(duì)一個(gè)數(shù)據(jù)的某些位定值為1。
例如,如果想使一個(gè)數(shù)a的低4位改為1,則只需要將a與(178)進(jìn)行按位或運(yùn)算即可。
3. 異或運(yùn)算符(^)
運(yùn)算觃則:若參加運(yùn)算的兩個(gè)二進(jìn)制位值相同則為0,否則為1。即0^0=0,0^1=1,1^0=1,1^1=0。
例如:

【例5-16】異或運(yùn)算。
(1)在Visual C++6.0中,新建名稱為5-16.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-18所示。

圖5-18 程序運(yùn)行結(jié)果15
異或運(yùn)算通常應(yīng)用在以下幾個(gè)方面。
(1)使特定位翻轉(zhuǎn)。設(shè)有一個(gè)數(shù)為01111010,想使其低4位翻轉(zhuǎn),即1變0,0變1,可以將其與00001111進(jìn)行異或運(yùn)算。
例如:

運(yùn)算結(jié)果的低4位正好是原數(shù)低4位的翻轉(zhuǎn)??梢姡鼓膸孜环D(zhuǎn)就將與其進(jìn)行異或運(yùn)算的幾位置為1即可。
(2)與“0”相異或,保留原值。例如,012^00=012。

因?yàn)樵瓟?shù)中的1與0進(jìn)行異或運(yùn)算得1,0^0得0,故保留原數(shù)。
(3)交換兩個(gè)值,不用臨時(shí)變量。
【例5-17】異或運(yùn)算交換兩個(gè)數(shù)。
(1)在Visual C++6.0中,新建名稱為5-17.c的Text File文件。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-19所示。

圖5-19 程序運(yùn)行結(jié)果16
4. 取反運(yùn)算符(~)
取反運(yùn)算符為單目運(yùn)算符,用于求整數(shù)的二進(jìn)制反碼,即分別將操作數(shù)各二進(jìn)制位上的1變?yōu)?,0變?yōu)?。
5. 左移運(yùn)算符(<<)
左移運(yùn)算符是用來將一個(gè)數(shù)的各二進(jìn)制位左移若干位,移動(dòng)的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)值),其右邊空出的位用0填補(bǔ),高位左移溢出則舍棄該高位。
例如,將a的二進(jìn)制數(shù)左移2位,右邊空出的位補(bǔ)0,左邊溢出的位舍棄。若a=15,即00001111,左移2位得到00111100。
左移1位相當(dāng)于該數(shù)乘以2,左移2位相當(dāng)于該數(shù)乘以4,15<<2=60,即乘以4。但此結(jié)論只適用于該數(shù)左移時(shí)被溢出舍棄的高位中不包含1的情況。
假設(shè)以一個(gè)字節(jié)(8)位存儲(chǔ)一個(gè)整數(shù),若a為無符號(hào)整型變量,則a=64時(shí),左移1位時(shí)溢出的是0,而左移2位時(shí),溢出的高位中包含1。
6. 右移運(yùn)算符(>>)
右移運(yùn)算符用來將一個(gè)數(shù)的各二進(jìn)制位右移若干位,移動(dòng)的位數(shù)由右操作數(shù)指定(右操作數(shù)必須是非負(fù)值),移到右端的低位被舍棄,對(duì)于無符號(hào)數(shù),高位補(bǔ)0。對(duì)于有符號(hào)數(shù),某些機(jī)器將對(duì)左邊空出的部分用符號(hào)位填補(bǔ)(即算術(shù)移位),而另一些機(jī)器則對(duì)左邊空出的部分用0填補(bǔ)(即邏輯移位)。
注意:對(duì)無符號(hào)數(shù),右移時(shí)左邊高位移入0;對(duì)于有符號(hào)數(shù),如果原來符號(hào)位為0(該數(shù)為正),則左邊也是移入0。如果符號(hào)位原來為1(即負(fù)數(shù)),則左邊移入0還是1,取決于所用的計(jì)算機(jī)系統(tǒng)。有的系統(tǒng)移入0,有的系統(tǒng)移入1。移入0的稱為邏輯移位,即簡單移位;移入1的稱為算術(shù)移位。
例如,a的值是八進(jìn)制數(shù)113755,則:
a: 1001011111101101 (用二進(jìn)制形式表示)
a>>1: 0100101111110110 (邏輯右移時(shí))
a>>1: 1100101111110110 (算術(shù)右移時(shí))
在有些系統(tǒng)中,a>>1得八進(jìn)制數(shù)045766,而在另一些系統(tǒng)上可能得到的是145766。Turbo C和其他一些C編譯采用的是算術(shù)右移,即對(duì)有符號(hào)數(shù)右移時(shí),如果符號(hào)位原來為1,左面移入高位的是1。
7. 復(fù)合賦值運(yùn)算符
位運(yùn)算符與賦值運(yùn)算符可以組成復(fù)合賦值運(yùn)算符,如&=、|=、>>=、<<=、^=等。
例如:

5.5 優(yōu)先級(jí)與結(jié)合性

C語言與其他高級(jí)語言相比,一個(gè)顯著的特點(diǎn)就是其運(yùn)算符特別豐富,共有34種運(yùn)算符。C語言將這34種運(yùn)算符觃定了不同的優(yōu)先級(jí)別和結(jié)合性。優(yōu)先級(jí)是用來標(biāo)識(shí)運(yùn)算符在表達(dá)式中的運(yùn)算順序的,在求解表達(dá)式的值的時(shí)候,總是先按運(yùn)算符的優(yōu)先次序由高到低進(jìn)行操作,可是,當(dāng)一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符優(yōu)先級(jí)別相同時(shí),則按運(yùn)算符的結(jié)合性來確定表達(dá)式的運(yùn)算順序。
C語言中,運(yùn)算符的優(yōu)先級(jí)共分為15級(jí)。1級(jí)最高,15級(jí)最低。在表達(dá)式中,優(yōu)先級(jí)較高的先于優(yōu)先級(jí)較低的進(jìn)行運(yùn)算。而當(dāng)在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí),則按運(yùn)算符的結(jié)合性所觃定的結(jié)合方向處理。
C語言中所有運(yùn)算符的優(yōu)先級(jí),如表5-4所示。
表5-4 運(yùn)算符的優(yōu)先級(jí)

C語言中各運(yùn)算符結(jié)合性分為左結(jié)合性(自左至右)和右結(jié)合性(自右至左)兩種。如算術(shù)運(yùn)算符(+、-、*、/)的結(jié)合性是自左向右,即先左后右。例如:
x-y+z; /*則y應(yīng)先與"-"號(hào)結(jié)合,執(zhí)行x-y運(yùn)算,然后再執(zhí)行+z的運(yùn)算*/
這種自左向右的結(jié)合方向就稱為左結(jié)合性。而自右向左的結(jié)合方向稱為右結(jié)合性,最典型的右結(jié)合運(yùn)算符是賦值運(yùn)算符。例如:
x=y=z; /*由于"="的右結(jié)合性,應(yīng)先執(zhí)行y=z再執(zhí)行x=(y=z)運(yùn)算*/
C語言運(yùn)算符中有不少為右結(jié)合性,為避克理解錯(cuò)誤,應(yīng)注意以下區(qū)別。
(1)一般而言,多數(shù)運(yùn)算符具有左結(jié)合性,單目運(yùn)算符、三目運(yùn)算符、賦值運(yùn)算符具有右結(jié)合性。
(2)當(dāng)一個(gè)表達(dá)式包含兩個(gè)或兩個(gè)以上的運(yùn)算符時(shí),運(yùn)算分量的結(jié)合方式由優(yōu)先級(jí)決定。先計(jì)算優(yōu)先級(jí)高的,再計(jì)算優(yōu)先級(jí)低的。例如:
5+3*2;
因?yàn)槌朔ㄟ\(yùn)算符的優(yōu)先級(jí)比加法運(yùn)算符高,所以3和2相乘,得到6,然后6和5相加,得到11。
(3)如果一個(gè)表達(dá)式包含的運(yùn)算符優(yōu)先級(jí)相同,則按照結(jié)合性觃定的方向處理。例如:
a/b%c;
因?yàn)椋?具有相同的優(yōu)先級(jí),按左結(jié)合的結(jié)合性,其等價(jià)于:
(a/b)%c;
又如:
!p++;
因?yàn)?和++優(yōu)先級(jí)相同,而且都是右結(jié)合,因此其等價(jià)于:
!(p++);
(4)通??梢允褂脠A括號(hào)強(qiáng)制地把運(yùn)算分量結(jié)合在一起。被括號(hào)括住的子表達(dá)式會(huì)被當(dāng)作一個(gè)獨(dú)立的個(gè)體進(jìn)行處理,這個(gè)個(gè)體同樣要受到優(yōu)先級(jí)和結(jié)合性的約束。例如:
(5+3*2)%7;
這里強(qiáng)制把5+3*2當(dāng)成一個(gè)個(gè)體來處理。因?yàn)槌朔ㄟ\(yùn)算符的優(yōu)先級(jí)比加法運(yùn)算符高,所以3*2=6;然后5和6相加,得到11;11對(duì)7取余得到4。
(5)由于賦值運(yùn)算符的結(jié)合性是從右到左。例如:
i=j=k=l;
其結(jié)合方式等價(jià)于:
(i=(j=(k=l)));
5.6 綜合案例——計(jì)算函數(shù)的結(jié)果

【例5-18】輸入三角形的三邊長,求三角形的面積。
(1)在Visual C++6.0中,新建名稱為5-18.c的Text File文件。
已知三角形的三邊長a,b,c,則該三角形的面積公式為:,其中s=(a+b+c)/2。
(2)在代碼編輯區(qū)域輸入以下代碼。

(3)程序運(yùn)行結(jié)果如圖5-20所示。

圖5-20 程序運(yùn)行結(jié)果17
5.7 就業(yè)面試技巧與解析
C語言中運(yùn)算符和表達(dá)式數(shù)量非常多,正是豐富的運(yùn)算符和表達(dá)式使C語言功能十分完善,這也是C語言的主要特點(diǎn)之一,這一部分也是考官容易問到的。
5.7.1 面試技巧與解析(一)
面試官:自增自減前操作與后操作的區(qū)別?
應(yīng)聘者:自增自減前操作的優(yōu)先級(jí)大于賦值運(yùn)算符“=”,而自增自減后操作的優(yōu)先級(jí)小于賦值運(yùn)算符,自增自減后操作表達(dá)式的值不會(huì)發(fā)生改變。
5.7.2 面試技巧與解析(二)
面試官:邏輯運(yùn)算符與其他運(yùn)算符有什么關(guān)系?
應(yīng)聘者:邏輯運(yùn)算符只返回true或false這兩種值,它們可以用來作為判斷條件,邏輯運(yùn)算符不會(huì)改變被操作數(shù)的值。
- 數(shù)據(jù)庫系統(tǒng)教程(第2版)
- Java EE 6 企業(yè)級(jí)應(yīng)用開發(fā)教程
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- TypeScript實(shí)戰(zhàn)指南
- Python數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)實(shí)戰(zhàn)
- WebRTC技術(shù)詳解:從0到1構(gòu)建多人視頻會(huì)議系統(tǒng)
- SQL Server 2016數(shù)據(jù)庫應(yīng)用與開發(fā)
- HTML5從入門到精通 (第2版)
- 批調(diào)度與網(wǎng)絡(luò)問題的組合算法
- Selenium Testing Tools Cookbook(Second Edition)
- Java EE Web應(yīng)用開發(fā)基礎(chǔ)
- Magento 2 Beginners Guide
- ASP.NET Web API Security Essentials
- Spring MVC Blueprints
- BackTrack 5 Cookbook