23運(yùn)算符和表達(dá)式_第1頁
23運(yùn)算符和表達(dá)式_第2頁
23運(yùn)算符和表達(dá)式_第3頁
23運(yùn)算符和表達(dá)式_第4頁
23運(yùn)算符和表達(dá)式_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

§2.3

運(yùn)算符和表達(dá)式

2.3.1

表達(dá)式

2.3.2算術(shù)運(yùn)算符2.3.3賦值運(yùn)算符2.3.4不同數(shù)據(jù)類型數(shù)據(jù)間的混合運(yùn)算2.3.5關(guān)系運(yùn)算符2.3.6邏輯運(yùn)算符2.3.7增1/減1運(yùn)算符2.3.8位邏輯運(yùn)算符2.3.9其它運(yùn)算符3.1表達(dá)式表達(dá)式的概念表達(dá)式是用運(yùn)算符與圓括號(hào)將操作數(shù)連接起來所構(gòu)成的式子。C語言的操作數(shù)包括常量、變量、函數(shù)值等。

根據(jù)表達(dá)式進(jìn)行運(yùn)算,得到的數(shù)值即為表達(dá)式的解。

表達(dá)式與簡(jiǎn)單語句在C語言中,在一個(gè)表達(dá)式的后面加上分號(hào)“;”就構(gòu)成了簡(jiǎn)單語句。

有意義的簡(jiǎn)單語句

無意義的簡(jiǎn)單語句

3.2算術(shù)運(yùn)算符

種類及運(yùn)算+-*/%注意:

兩個(gè)整數(shù)相除,結(jié)果仍為整數(shù),商向下取整。取模運(yùn)算符%實(shí)際上是數(shù)學(xué)運(yùn)算的求余數(shù)運(yùn)算,其兩個(gè)操作對(duì)象都必須是整數(shù)。減法運(yùn)算符還可以用做單目運(yùn)算符,是取負(fù)運(yùn)算。其余操作符均為雙目運(yùn)算符。

算術(shù)表達(dá)式及算術(shù)運(yùn)算符的優(yōu)先級(jí)

算術(shù)表達(dá)式就是用算術(shù)運(yùn)算符和圓括號(hào)將操作數(shù)連接起來的式子。算術(shù)表達(dá)式的解就是經(jīng)過算術(shù)運(yùn)算得到的表達(dá)式的值。算術(shù)運(yùn)算符的優(yōu)先級(jí)與數(shù)學(xué)基本相同,即先乘除,后加減。取模運(yùn)算的優(yōu)先級(jí)與乘除相同。函數(shù)和圓括號(hào)的優(yōu)先級(jí)最高。

注意:

算術(shù)表達(dá)式應(yīng)能正確的表達(dá)數(shù)學(xué)公式。例如:數(shù)學(xué)表達(dá)式是3+x

2a

相應(yīng)的C語言表達(dá)式應(yīng)該是什么呢?算術(shù)表達(dá)式的結(jié)果應(yīng)該不超過其所能表示的數(shù)的范圍。例如,最大的整型數(shù)是32767,那么,32767+3就不會(huì)是正確的結(jié)果。而

32767L+3的結(jié)果是正確的,因?yàn)?2767L是長(zhǎng)整型數(shù)。算術(shù)運(yùn)算符的結(jié)合性

運(yùn)算符的結(jié)合性是指如果一個(gè)操作數(shù)左邊和右邊的兩個(gè)運(yùn)算符的優(yōu)先級(jí)相同,應(yīng)該優(yōu)先計(jì)算的操作符。例如:a+b-c

操作數(shù)b左右的運(yùn)算符+和-的優(yōu)先級(jí)相同,那么,是先計(jì)算b-c,還是先計(jì)算a+b呢?C語言規(guī)定雙目算術(shù)運(yùn)算符的結(jié)合性是自左至右,也就是b先與左邊a結(jié)合,再與右邊c結(jié)合。所以是先計(jì)算a+b,然后用a+b的結(jié)果減c。

雙目運(yùn)算符的結(jié)合性與數(shù)學(xué)運(yùn)算并無不同。3.3賦值運(yùn)算符

普通賦值運(yùn)算符

賦值表達(dá)式的一般形式是:變量名=表達(dá)式賦值語句的一般形式是:變量名=表達(dá)式;

賦值運(yùn)算符的優(yōu)先級(jí)小于算術(shù)運(yùn)算符。賦值運(yùn)算符的結(jié)合性是自右至左,

以a=b=2為例

復(fù)合賦值運(yùn)算符

把賦值運(yùn)算符與算術(shù)、位邏輯、移位運(yùn)算符放在一起,就構(gòu)成復(fù)合賦值運(yùn)算符。復(fù)合算術(shù)賦值運(yùn)算符有5個(gè)+=、-=、*=、/=、%=。還有與移位和位邏輯結(jié)合的復(fù)合賦值運(yùn)算符5個(gè)(<<=、>>=、&=、^=、|=)。

復(fù)合賦值運(yùn)算符的使用規(guī)則是:Xop=Y與X=XopY等價(jià)。3.4不同數(shù)據(jù)類型數(shù)據(jù)間的混合運(yùn)算

自動(dòng)轉(zhuǎn)換

強(qiáng)制轉(zhuǎn)換

賦值表達(dá)式的類型轉(zhuǎn)換自動(dòng)轉(zhuǎn)換

所謂“自動(dòng)轉(zhuǎn)換”就是系統(tǒng)根據(jù)規(guī)則自動(dòng)將兩個(gè)不同數(shù)據(jù)類型的運(yùn)算對(duì)象轉(zhuǎn)換成同一種數(shù)據(jù)類型的過程。而且,對(duì)某些數(shù)據(jù)類型,即使是兩個(gè)運(yùn)算對(duì)象的數(shù)據(jù)類型完全相同,也要做轉(zhuǎn)換,例如float。強(qiáng)制轉(zhuǎn)換

在C語言中,允許程序員根據(jù)自己的意愿將一種數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換成另一種數(shù)據(jù)類型。強(qiáng)制轉(zhuǎn)換的格式為:

(數(shù)據(jù)類型名)操作對(duì)象注意,強(qiáng)制轉(zhuǎn)換并不改變操作對(duì)象的數(shù)據(jù)類型和數(shù)值。例如,(int)f的確切含義是將f轉(zhuǎn)換成為整型值參與運(yùn)算,而f本身的數(shù)據(jù)類型和數(shù)值都沒有任何改變。賦值表達(dá)式的類型轉(zhuǎn)換當(dāng)賦值運(yùn)算符左邊的變量與賦值運(yùn)算符右邊的表達(dá)式的數(shù)據(jù)類型相同時(shí),不需要進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。當(dāng)賦值運(yùn)算符左邊的變量與賦值運(yùn)算符右邊的表達(dá)式的數(shù)據(jù)類型不相同時(shí),系統(tǒng)負(fù)責(zé)將右邊的數(shù)據(jù)類型轉(zhuǎn)換成左邊的數(shù)據(jù)類型。此時(shí),會(huì)有兩種情況產(chǎn)生,一種是轉(zhuǎn)換以后會(huì)丟失數(shù)據(jù),另一種是轉(zhuǎn)換以后不會(huì)丟失數(shù)據(jù)。這與賦值號(hào)兩邊的表達(dá)式的數(shù)據(jù)類型所占的字節(jié)數(shù)及存儲(chǔ)表示方式有關(guān)。(詳細(xì)內(nèi)容自學(xué))例3.1#include"stdio.h"voidmain(){intc;/*charc;*/c='B';printf("c=%c",c+'a'-'A');}

運(yùn)行結(jié)果:c=b例3.2#include"stdio.h"voidmain(){charc;

inti=0x3241;

printf("i=%c\n",i);c=i;

printf("c=%d\n",c);

printf("i=%d\n",i);}運(yùn)行結(jié)果i=Ac=65i=128653.5關(guān)系運(yùn)算符所謂關(guān)系運(yùn)算,實(shí)際上就是比較兩個(gè)數(shù)值的大小。那么,比較兩個(gè)數(shù)值的大小的運(yùn)算符就是關(guān)系運(yùn)算符。關(guān)系運(yùn)算符有六個(gè)>、>=、<、<=、==、!=。由關(guān)系運(yùn)算符連接起來的表達(dá)式就是關(guān)系表達(dá)式。關(guān)系表達(dá)式的解一般應(yīng)為真或假,C語言用整數(shù)1表示真,整數(shù)0表示假。

初學(xué)者經(jīng)常會(huì)混淆關(guān)系運(yùn)算符“==”和賦值運(yùn)算符“=”,因此要注意區(qū)分這兩個(gè)運(yùn)算符。例3.3#include"stdio.h"voidmain(){

intx,y,z1,z2;x=2;y=2;z1=(x=y);z2=(x==y);

printf("%d,%d\n",z1,z2);}六個(gè)關(guān)系運(yùn)算符中的“!=”和“==”的優(yōu)先級(jí)小于其余四個(gè)運(yùn)算符。

關(guān)系運(yùn)算符的優(yōu)先級(jí)小于算術(shù)運(yùn)算符,大于賦值運(yùn)算符。關(guān)系運(yùn)算符的結(jié)合性均為自左至右。

當(dāng)多種運(yùn)算符在一個(gè)表達(dá)式中同時(shí)使用時(shí),要注意運(yùn)算符的優(yōu)先級(jí),防止記錯(cuò)運(yùn)算符優(yōu)先級(jí)的最好方法是加圓括號(hào)。

例3.4注意,不贊成按本例這樣編寫程序。#include"stdio.h"voidmain(){

intx,y,z,i,j;x=4,y=3,z=2;i=y>z;j=x>y>z;

printf("%2d,%2d,",i,j);

printf("%2d,",z>y==3);

printf("%2d,",y+z<x);

printf("%2d\n",y+2>=z+1);}運(yùn)行結(jié)果為:1,0,0,0,13.6邏輯運(yùn)算符

如果將“與、或、非”運(yùn)算應(yīng)用于邏輯值(邏輯真和邏輯假)則稱為邏輯運(yùn)算。

C語言中的邏輯運(yùn)算符有三個(gè):邏輯與&&、邏輯或||和邏輯非!

其中邏輯與和邏輯或是雙目運(yùn)算符,而邏輯非是單目運(yùn)算符。邏輯運(yùn)算的規(guī)則與二進(jìn)制的位邏輯是相似的。邏輯運(yùn)算的規(guī)則下表:

C語言系統(tǒng)對(duì)任何非0值都認(rèn)定為是邏輯真,而將0認(rèn)定為邏輯假。如果一個(gè)表達(dá)式參與邏輯運(yùn)算,只要這個(gè)表達(dá)式的解為非0,則系統(tǒng)就認(rèn)為這個(gè)表達(dá)式的結(jié)果是邏輯真。但是要注意,系統(tǒng)邏輯運(yùn)算的結(jié)果仍然只有兩個(gè):1(邏輯真)和0(邏輯假)。

邏輯運(yùn)算符經(jīng)常與關(guān)系運(yùn)算符一起使用。

C語言表達(dá)式(x>=10)&&(x<=100)的數(shù)學(xué)含義是:10≤x≤100

邏輯運(yùn)算符的優(yōu)先級(jí)!&&||高低!的優(yōu)先級(jí)高于算術(shù)運(yùn)算符(當(dāng)然也高于關(guān)系運(yùn)算符)和賦值運(yùn)算符

&&和||的優(yōu)先級(jí)高于賦值運(yùn)算符,但是低于算術(shù)運(yùn)算符和關(guān)系運(yùn)算符。!單目運(yùn)算符,其結(jié)合性是自右至左;&&和||的結(jié)合性是自左至右。

計(jì)算表達(dá)式7<8&&3||6>9-!0的值

注意:在C語言中,如果邏輯運(yùn)算符的左操作數(shù)已經(jīng)能夠確定表達(dá)式的解,則系統(tǒng)不再計(jì)算右操作數(shù)的值。

x==1&&y==0

若x此時(shí)不為1,在檢測(cè)x==1以后,就不會(huì)再檢測(cè)y==0。因?yàn)閤==1的結(jié)果是邏輯假,邏輯假與任何數(shù)進(jìn)行邏輯與操作結(jié)果都會(huì)是邏輯假。

x==y||x=0

若x==y成立,則表達(dá)式的值為真,不需要繼續(xù)做x=0了。但是,若x==y不成立,由于x=0是個(gè)賦值表達(dá)式,表達(dá)式的結(jié)果很可能是錯(cuò)誤的。假設(shè)該表達(dá)式計(jì)算以前,x值為1,y的值為0,x==y的計(jì)算結(jié)果是0,這時(shí)需要執(zhí)行賦值x=0,表達(dá)式的結(jié)果仍然是0,而實(shí)際上這時(shí)的x和y的值均為0,又滿足了x==y,這不是產(chǎn)生了矛盾嗎?不要在一般的表達(dá)式中夾雜賦值運(yùn)算3.7增1/減1運(yùn)算符

++和--。這兩個(gè)運(yùn)算符都是單目運(yùn)算符,其功能分別是將變量自身的內(nèi)容增1和減1。++i和--i是前綴表示法,i++和i--是后綴表示法。如果直接在++i和i++的后面加上分號(hào)構(gòu)成C的執(zhí)行語句,即++i;和i++;前綴與后綴并無區(qū)別(減1符號(hào)也一樣)。但是,將它們用在表達(dá)式中則前綴與后綴是有區(qū)別的。前綴表示法是先將i值增/減1,再在表達(dá)式中使用;而后綴表示法是先在表達(dá)式中使用i的值,再將i值增/減1。例如:i=3;i=3;j=i++;

j=++i;

結(jié)果j的內(nèi)容為3j的內(nèi)容為4

i的內(nèi)容為4i的內(nèi)容為4

注意:

增1/減1運(yùn)算符的操作對(duì)象是一個(gè)變量2++、--2以及(x/y)++均為非法增1/減1運(yùn)算符的優(yōu)先級(jí)高于算術(shù)運(yùn)算符,與單目運(yùn)算符-(取負(fù))、?。ㄟ壿嫹牵┑膬?yōu)先級(jí)相同,結(jié)合方向自右至左。例如表達(dá)式-i++等價(jià)于-(i++)副作用:printf(“%d,%d”,i,i++);在不同的編譯環(huán)境下結(jié)果有可能不同。盡量不要在一般的表達(dá)式中將增1/減1運(yùn)算符與其它運(yùn)算符混合使用。3.8位邏輯運(yùn)算符~<<>>&|^按位取反左移右移按位與按位或按位異或操作數(shù)在實(shí)現(xiàn)位操作時(shí)按二進(jìn)制進(jìn)行運(yùn)算,7一般應(yīng)為無符號(hào)型整數(shù)。

按位與&

按位與的運(yùn)算規(guī)則是:0&0=00&1=01&0=01&1=1例如:charw1,w2,w3;w1=10;w2=8;w3=w1&w2;w3的內(nèi)容可以通過下式運(yùn)算:0000101000001000(按位與&)00001000(結(jié)果)

&運(yùn)算經(jīng)常用于把特定位清零(屏蔽)。例如,

a的值為11011010,b的值為11110000,

a&b11011010&1111000011010000

相當(dāng)于把a(bǔ)的低4位屏蔽,高4位不變。

按位或|按位或的運(yùn)算規(guī)則是:0|0=00|1=11|0=11|1=1例如:charw1,w2,w3;w1=10;w2=8;w3=w1|w2;w3的內(nèi)容可以通過下式運(yùn)算:0000101000001000(按位或|)00001010(結(jié)果)按位異或^按位或的運(yùn)算規(guī)則是:0^0=00^1=11^0=11^1=0例如:charw1,w2,w3;w1=10;w2=8;w3=w1^w2;w3的內(nèi)容可以通過下式運(yùn)算:0000101000001000(按位異或^)

00000010(結(jié)果)按位取反~按位取反的規(guī)則是:~0=1~1=0注意:對(duì)于位邏輯反來說,~0x7在16位機(jī)上的表示是1111111111111000即0xfff8,但在32位機(jī)上的表示是0xfffffff8,所以通常用~0x7來表示7的邏輯非,而不用0xfff8或oxfffffff8。移位運(yùn)算符

左移<<右移>>雙目運(yùn)算符,運(yùn)算符右邊的表達(dá)式表示移位的位數(shù)。

x=x<<2表示把x進(jìn)行左移以后賦值給x,注意不能只用x<<2

左移可以擴(kuò)大原數(shù)的倍數(shù),左移1位擴(kuò)大2倍,左移2位擴(kuò)大4倍,…。右移可以縮小原數(shù)的倍數(shù)。右移時(shí),若符號(hào)位為0,則右邊填零。若符號(hào)位為1,根據(jù)機(jī)器不同分為算術(shù)移位(填充1)邏輯移位(填充0)。3.9其它運(yùn)算符逗號(hào)運(yùn)算符表達(dá)式1,表達(dá)式2逗號(hào)表達(dá)式的求值過程是:先求解表達(dá)式1,再求解表達(dá)式2,并將表達(dá)式2的解作為逗號(hào)表達(dá)式的解。例如5,6的值是6

z=(y=3,x*y)與z=x*(y=3)是等價(jià)的逗號(hào)運(yùn)算符一般用于循環(huán)for語句,不提倡使用在其它的表達(dá)式中。

求字節(jié)數(shù)運(yùn)算符

sizeof是一個(gè)比較特殊的單目運(yùn)算符,也是一個(gè)非常有用的運(yùn)算符,經(jīng)常用于動(dòng)態(tài)分配空間。其語法格式為:

sizeof(表達(dá)式)表達(dá)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論