




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第三章 運算符與表達式3、1 C運算符簡介運算符:狹義的運算符是表示各種運算的符號。表達式:使用運算符將常量、變量、函數連接起來,構成表達式。C語言運算符豐富,范圍很寬,把除了控制語句和輸入/輸出以外的幾乎所有的基本操作都作為運算符處理,所以C語言運算符可以看作是操作符。C語言豐富的運算符構成C語言豐富的表達式(是運算符就可以構成表達式)。運算符豐富、表達式豐富、靈活。在C語言中除了提供一般高級語言的算術、關系、邏輯運算符外,還提供賦值符運算符,位操作運算符、自增自減運算符等等。甚至數組下標,函數調用都作為運算符。C的運算符有以下幾類:本章主要介紹算術運算符(包括自增自減運算符)、賦值運算符、
2、逗號運算符,其它運算符在以后相關章節中結合有關內容陸續進行介紹。3、2 算術運算符和算術表達式1、算術運算符+(加法運算符。如3+5)-(減法運算符或負值運算符。如5-2,-3)*(乘法運算符。如3*5)/(除法運算符。如5/3,5.0/3)%(模運算符或求余運算符,%要求兩側均為整型數據。如7%4的值為3)。除了負值運算符-單目運算符外,其它都是雙目運算符。說明:(1) 兩個整數相除的結果為整數,如5/3的結果為1,舍去小數部分。但是如果除數或被除數中有一個為負值,則舍入的方向是不固定的,多數機器采用“向0取整”的方法(實際上就是舍去小數部分,注意:不是四舍五入)。(2) 如果參加+,-,*
3、,/運算的兩個數有一個為實數,則結果為double型,因為所有實數都按double型進行計算。(3) 求余運算符%,要求兩個操作數均為整型,結果為兩數相除所得的余數。求余也稱為求模。一般情況,余數的符號與被除數符號相同。例如:-8%5=-3;8%-5=32、算術表達式算術表達式:用算術運算符和括號將運算對象(也稱操作數)連接起來的、符合C語法規則的式子,稱為算術表達式。運算對象可以是常量、變量、函數等。例如,下面是一個合法的C算術表達式。a*b/c-1.5+a。注意:C語言算術表達式的書寫形式與數學表達式的書寫形式有一定的區別:(1) C語言算術表達式的乘號(*)不能省略。例如:數學式b2-4
4、ac,相應的C表達式應該寫成:b*b-4*a*c。(2) C語言表達式中只能出現字符集允許的字符。例如,數學r2相應的C表達式應該寫成:PI*r*r。(其中PI是已經定義的符號常量)(3) C語言算術表達式不允許有分子分母的形式。例如,(a+b)/(c+d)。(4) C語言算術表達式只使用圓括號改變運算的優先順序(不要指望用)。可以使用多層圓括號,此時左右括號必須配對,運算時從內層括號開始,由內向外依次計算表達式的值。3、(算術)運算符的優先級與結合性(P.233附錄IV)C語言規定了進行表達式求值過程中,各運算符的“優先級”和“結合性”。(1)C語言規定了運算符的“優先級”和“結合性”。在表
5、達式求值時,先按運算符的“優先級別”高低次序執行。如表達式:a-b*c等價于a-(b*c),“*”運算符優先級高于“-”運算符。(2)如果在一個運算對象兩側的運算符的優先級別相同,則按規定的“結合方向”處理。例如:a-b+c,到底是(a-b)+c還是a-(b+c)?(b先與a參與運算還是先于c參與運算?)查附錄IV可知:+/-運算優先級別相同,結合性為“自左向右”,即就是說b先與左邊的a結合。所以a-b+c等價于(a-b)+c。左結合性(自左向右結合方向):運算對象先與左面的運算符結合。右結合性(自右向左結合方向):運算對象先與右面的運算符結合。(3)在書寫多個運算符的表達式時,應當注意各個運
6、算符的優先級,確保表達式中的運算符能以正確的順序參與運算。對于復雜表達式為了清晰起見可以加圓括號“()”強制規定計算順序。3、3 賦值運算符和賦值表達式1、 賦值運算符、賦值表達式賦值運算符:賦值符號“=”就是賦值運算符。賦值表達式:由賦值運算符組成的表達式稱為賦值表達式。一般形式:變量賦值符表達式賦值表達式的求解過程:將賦值運算符右側的表達式的值賦給左側的變量,同時整個賦值表達式的值就是剛才所賦的值。賦值的含義:將賦值運算符右邊的表達式的值存放到左邊變量名標識的存儲單元中。例如:x=10+y; 執行賦值運算(操作),將10+y的值賦給變量x,同時整個表達式的值就是剛才所賦的值。說明:(1)
7、賦值運算符左邊必須是變量,右邊可以是常量、變量、函數調用或常量、變量、函數調用組成的表達式。例如:x=10 y=x+10 y=func()都是合法的賦值表達式。(2) 賦值符號“=”不同于數學的等號,它沒有相等的含義。(“=”相等)例如:C語言中x=x+1是合法的(數學上不合法),它的含義是取出變量x的值加1,再存放到變量x中。(3) 賦值運算時,當賦值運算符兩邊數據類型不同時,將由系統自動進行類型轉換。轉換原則是:先將賦值號右邊表達式類型轉換為左邊變量的類型,然后賦值。l 將實型數據(單、雙精度)賦給整型變量,舍棄實數的小數部分。l 將整型數據賦給單、雙精度實型變量,數值不變,但以浮點數形式
8、存儲到變量中。l 將double型數據賦給float型變量時,截取其前面7位有效數字,存放到float變量的存儲單元中(32bits)。但應注意數值范圍不能溢出。將float型數據賦給double型變量時,數值不變,有效位數擴展到16位(64bits)。l 字符型數據賦給整型變量時,由于字符只占一個字節,而整型變量為2個字節,因此將字符數據(8bits)放到整型變量低8位中。有兩種情況:如果所使用的系統將字符處理為無符號的量或對unsigned char型變量賦值,則將字符的8位放到整型變量的低8位,高8位補0。如果所使用的系統將字符處理為帶符號的量(signed char)(如Turbo C
9、),若字符最高位為0,則整型變量高8位補0;若字符最高位為1,則整型變量高8位全補1。這稱為符號擴展,這樣做的目的是使數值保持不變。l 將一個int,short,long型數據賦給一個char型變量時,只是將其低8位原封不動地送到char型變量(即截斷)。l 將帶符號的整型數據(int型)賦給long型變量時,要進行符號擴展。即,將整型數的16位送到long型低16位中,如果int型數值為正,則long型變量的高16位補0,如果int型數值為負,則long型變量的高16位補1,以保證數值不變。反之,若將一個long型數據賦給一個int型變量,只將long型數據中低16位原封不動地送到整型變量(
10、即截斷)。l 將unsigned int型數據賦給long int型變量時,不存在符號擴展問題,只要將高位補0即可。將一個unsigned類型數據賦給一個占字節相同的整型變量,將unsigned型變量的內容原樣送非unsigned型變量中,但如果數據范圍超過相應整數的范圍,則會出現數據錯誤。l 將非unsigned型數據賦給長度相同的unsigned型變量,也是原樣照賦。總之:不同類型的整型數據間的賦值歸根到底就是:按照存儲單元的存儲形式直接傳送。(由長型整數賦值給短型整數,截斷直接傳送;由短型整數賦值給長型整數,低位直接傳送,高位根據低位整數的符號進行符號擴展)。(4) C語言的賦值符號“=
11、”除了表示一個賦值操作外,還是一個運算符,也就是說賦值運算符完成賦值操作后,整個賦值表達式還會產生一個所賦的值,這個值還可以利用。賦值表達式的求解過程是:l 先計算賦值運算符右側的“表達式”的值l 將賦值運算符右側“表達式”的值賦值給左側的變量。l 整個賦值表達式的值就是被賦值變量的值。例如:分析x=y=z=3+5這個表達式。根據優先級:原式óx=y=z=(3+5);根據結合性(從右向左):óx=(y=(z=(3+5)óx=(y=(z=3+5)z=3+5:先計算3+5,得值8賦值給變量z,z的值為8,(z=3+5)整個賦值表達式值為8;y=(z=3+5):將上面(
12、z=3+5)整個賦值表達式值8賦值給變量y,y的值為8,(y=(z=3+5))整個賦值表達式值為8;x=(y=(z=3+5):將上面(y=(z=3+5))整個賦值表達式值8賦值給變量,z的值為8,整個表達式x=(y=(z=3+5)的值為8。最后,x,y,z都等于8運算步驟:序號表達式變量及值表達式的值1z=3+5z(8)82y=(z=3+5)y(8)83x=(y=(z=3+5)x(8)8將賦值表達式作為表達式的一種,使賦值操作不僅可以出現在賦值語句中,而且可以以表達式的形式出現在其它語句中。2、 復合賦值運算符在賦值符“=”之前加上某些運算符,可以構成復合賦值運算符,復合賦值運算符可以構成賦值
13、表達式。C語言中許多雙目運算符可以與賦值運算符一起構成復合運算符,即:+=,-=,*=,/=,%=,<<=,>>=,&=,|=,=<變量><雙目運算符>=<表達式><變量>=<變量><雙目運算符><表達式>復合賦值表達式一般形式:等價于:例如:n+=1 等價于 n=n+1x*=y+1 等價于 x=x*(y+1) 注意:賦值運算符、復合賦值運算符的優先級比算術運算符低。3、 賦值運算符、賦值表達式舉例(1) a=5(2) a=b=5(3) a=(b=4)+(c=3)(4) 假如a=
14、12,分析:a+=a-=a*aa+=a-=a*aóa+=a-=(a*a)óa+=(a-=(a*a)óa+=(a=a-(a*a)óa+=(a=a-a*a)óa=a+(a=a-a*a)3、 4 自增、自減運算符單目運算符,使變量的值增1或減1。如:+i,i+ -i,i注意:(1) +i,-i(前置運算):先自增、減,再參與運算;i+,i(后置運算):先參與運算, 再自增、減。例如:i=3,分析j=+i; j=i+;(2) 自增、減運算符只用于變量,而不能用于常量或表達式。例如:6+,(a+b)+,(-i)+都不合法。(3) +,-的結合方向是“自右
15、向左”(與一般算術運算符不同)。例如:-i+ó-(i+) 合法。(4) 自增、自減運算符常用于循環語句中,使循環變量自動加1,也用于指針變量,使指針指向下一個地址。有關表達式使用過程中的問題說明(1) C運算符和表達式使用靈活,利用這一點可以巧妙處理許多在其它語言中難以處理的問題。但是ANSI C并沒有具體規定表達式中的子表達式的求值順序,允許各編譯系統自己安排。這可能導致有些表達式對不同編譯系統有不同的解釋,并導致最終結果的不一致。例1:a=f1()+f2()中f1,f2哪個先調用。例2:i=3,表達式(i+)+(i+)+(i+)的值。有些系統等價3+4+5,Turbo C等價3+
16、3+3(2) C語言有的運算符為一個字符,有的由兩個字符組成,C編譯系統在處理時盡可能多地將若干字符組成一個運算符(在處理標識符、關鍵字時也按同一原則處理)。如i+j將解釋為(i+)+j而不是i+(+j)。為避免誤解,最好采用大家都能理解的寫法,比如通過增加括號明確組合關系,改善可讀性。(3) C語言中類似的問題還有函數調用時,實參的求值順序,C標準也無統一規定。如:i=3,printf(“%d,%d”,i,i+);有些系統執行的結果為3,3;有些系統為4,3。總之,不要寫別人看不懂(難看懂)、也不知道系統會怎樣執行的程序。3、5 逗號運算符和逗號表達式C語言提供一種特殊的運算符-逗號運算符(順序求值運算符)。用它將兩個或多個表達式連接起來,表示順序求值(順序處理)。用逗號連接起來的表達式稱為逗號表達式。例如:3+5,6+8表達式1,表達式2,表達式n逗號表達式的一般形式:逗號表達式的求解過程是:自左向右,求解表達式1,求解表達式2,求解表達式n。整個逗號表達式的值是表達式n的值。例如:逗號表達式3+5,6+8的值為14。例題:a=3*5,a*4查運算符優先級表可知,“=”運算符優先級高于“,”運算符(事實上,逗號運算符級別最低)。所以上面的表達式等價于:(a=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇射陽中學2024~2025學年高二下冊6月期末考試數學試題含解析
- 消費者信任建立與維護考核試卷
- 中藥藥效評價與臨床用藥個體化研究考核試卷
- 印刷機精度提升在標簽印刷中的應用分析考核試卷
- 物聯網與智能設備的邊緣計算優勢考核試卷
- 財經大學-經濟管理專業-2017級《現代企業管理》試卷
- 絲織品在戶外運動服裝色彩與心理影響研究考核試卷
- 部編語文一年級上冊拼音拼讀練習冊
- 2025年中國HID手電筒數據監測研究報告
- 2025年中國C型組合角尺數據監測研究報告
- 風動鑿巖機操作規程(4篇)
- 自助餐的服務流程培訓
- 聯塑管材檢驗報告模板
- 部編版五年級上冊課內、課外閱讀訓練(教師+學生)+根據課文內容填空
- 浙江省杭州市(2024年-2025年小學四年級語文)部編版質量測試((上下)學期)試卷及答案
- 【建筑專業】16J914-1公用建筑衛生間(完整)
- DL∕T 1098-2016 間隔捧技術條件和試驗方法
- 化學-福建省泉州市2023~2024學年高一下學期期末教學質量監測試題和答案
- AQ/T 2059-2016 磷石膏庫安全技術規程(正式版)
- AQ 1011-2005 煤礦在用主通風機系統安全檢測檢驗規范(正式版)
- 2021年廣東省深圳實驗學校自主招生數學模擬試卷
評論
0/150
提交評論