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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

§2.3

運算符和表達式

2.3.1

表達式

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

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

表達式與簡單語句在C語言中,在一個表達式的后面加上分號“;”就構成了簡單語句。

有意義的簡單語句

無意義的簡單語句

3.2算術運算符

種類及運算+-*/%注意:

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

算術表達式及算術運算符的優(yōu)先級

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

注意:

算術表達式應能正確的表達數(shù)學公式。例如:數(shù)學表達式是3+x

2a

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

32767L+3的結果是正確的,因為32767L是長整型數(shù)。算術運算符的結合性

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

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

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

普通賦值運算符

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

賦值運算符的優(yōu)先級小于算術運算符。賦值運算符的結合性是自右至左,

以a=b=2為例

復合賦值運算符

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

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

自動轉換

強制轉換

賦值表達式的類型轉換自動轉換

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

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

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

運行結果: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);}運行結果i=Ac=65i=128653.5關系運算符所謂關系運算,實際上就是比較兩個數(shù)值的大小。那么,比較兩個數(shù)值的大小的運算符就是關系運算符。關系運算符有六個>、>=、<、<=、==、!=。由關系運算符連接起來的表達式就是關系表達式。關系表達式的解一般應為真或假,C語言用整數(shù)1表示真,整數(shù)0表示假。

初學者經常會混淆關系運算符“==”和賦值運算符“=”,因此要注意區(qū)分這兩個運算符。例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);}六個關系運算符中的“!=”和“==”的優(yōu)先級小于其余四個運算符。

關系運算符的優(yōu)先級小于算術運算符,大于賦值運算符。關系運算符的結合性均為自左至右。

當多種運算符在一個表達式中同時使用時,要注意運算符的優(yōu)先級,防止記錯運算符優(yōu)先級的最好方法是加圓括號。

例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);}運行結果為:1,0,0,0,13.6邏輯運算符

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

C語言中的邏輯運算符有三個:邏輯與&&、邏輯或||和邏輯非!

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

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

邏輯運算符經常與關系運算符一起使用。

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

邏輯運算符的優(yōu)先級!&&||高低!的優(yōu)先級高于算術運算符(當然也高于關系運算符)和賦值運算符

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

計算表達式7<8&&3||6>9-!0的值

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

x==1&&y==0

若x此時不為1,在檢測x==1以后,就不會再檢測y==0。因為x==1的結果是邏輯假,邏輯假與任何數(shù)進行邏輯與操作結果都會是邏輯假。

x==y||x=0

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

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

j=++i;

結果j的內容為3j的內容為4

i的內容為4i的內容為4

注意:

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

按位與&

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

&運算經常用于把特定位清零(屏蔽)。例如,

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

a&b11011010&1111000011010000

相當于把a的低4位屏蔽,高4位不變。

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

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

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

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

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

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

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

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

sizeof(表達式)表達

溫馨提示

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

評論

0/150

提交評論