C语言运算符与表达式实例分析
本篇內容主要講解“C語言運算符與表達式實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C語言運算符與表達式實例分析”吧!
表達式
函 數 概 述
表達式是C語言的主體。在C語言中,表達式由操作符和操作數組成。最簡單的表達式可以只含有一個操作數。根據表達式含有的操作符的個數,可以把表達式分為簡單表達式和復雜表達式兩種:簡單表達式是只含有一個操作符的表達式,而復雜表達式是包含兩個或兩個以上操作符的表達式。
5+5 iNumber+9 iBase+(iPay*iDay)
表達式本身什么事情也不做,只是返回結果值。在程序不對返回的結果值進行任何操作的情況下,返回的結果值不起任何作用,也就是忽略返回的值。
表達式返回的結果值是有類型的。表達式隱含的數據類型取決于組成表達式的變量和常量的類型。
賦值運算符與賦值表達式
變量賦初值
在聲明變量時,可以為其賦一個初值,就是將一個常數或者一個表達式的結果賦值給一個變量,變量中保存的內容就是這個常量或者賦值語句中表達式的值。這就是為變量賦初值。
先來看一下為變量賦值為常數的情況。一般的形式是:
類型 變量名 = 常數;
其中的變量名也稱為變量的標識符。
通過變量賦初值的一般形式,以下是相關的代碼實例:
charcChar='A'; intiFirst=100; floatfPlace=1450.78f;
賦值表達式為變量賦初值。
賦值語句把一個表達式的結果值賦給一個變量。一般的形式是:
類型 變量名 = 表達式;
可以看到,其一般形式與常數賦值的一般形式是相似的,例如:
intiAmount=1+2; floatfPrice=fBase+Day*3;
在上面的舉例中,得到賦值的變量iAmount和fPrice稱為左值,因為它出現的位置在賦值語句的左側。產生值的表達式稱為右值,因為它出現的位置在表達式的右側。
【實例】 為變量賦初值。為變量賦初值的操作是編程時常見的操作。在本實例中,模擬鐘點工的計費情況,使用賦值語句和表達式得出鐘點工工作8個小時后所得的薪水。
#include<stdio.h>
intmain()
{
intiHoursWorded=8;/*定義變量,為變量賦初值。表示工作時間*/
intiHourlyRate;/*聲明變量,表示一個小時的薪水*/
intiGrossPay;/*聲明變量,表示得到的工資*/
iHourlyRate=13;/*為變量賦值*/
iGrossPay=iHoursWorded*iHourlyRate;/*將表達式的結果賦值給變量*/
printf("TheHoursWordedis:%d\n",iHoursWorded);/*顯示工作時間變量*/
printf("TheHourlyRateis:%d\n",iHourlyRate);/*顯示一個小時的薪水*/
printf("TheGrossPayis:%d\n",iGrossPay);/*顯示工作所得的工資*/
return0;/*程序結束*/
}
自動類型轉換
數值類型有很多種,如字符型、整型、長整型和實型等,因為這些類型的變量、長度和符號特性都不同,所以取值范圍也不同。混合使用這些類型時會出現什么情況呢?第3章已經對此有所介紹。
C語言中使用一些特定的轉化規則。根據這些轉化規則,數值類型變量可以混合使用。如果把比較短的數值類型變量的值賦給比較長的數值類型變量,那么比較短的數值類型變量中的值會升級表示為比較長的數值類型,數據信息不會丟失。但是,如果把較長的數值類型變量的值賦給比較短的數值類型變量,那么數據就會降低級別表示,并且當數據大小超過比較短的數值類型的可表示范圍時,就會發生數據截斷。
有些編譯器遇到這種情況時就會發出警告信息,例如:
floati=10.1f; intj=i;
此時編譯器會發出警告,如圖所示:
強制類型轉換
通過自動類型轉化的介紹得知,如果數據類型不同,就可以根據不同情況自動進行類型轉化,但此時編譯器會提示警告信息。這個時候如果使用強制類型轉化告知編譯器,就不會出現警告。
強制類型轉化的一般形式為:
(類型名) (表達式)
例如在上述不同變量類型轉化時使用強制類型轉化的方法:
floati=10.1f; intj=(int)i;/*進行強制類型轉化*/
在代碼中可以看到在變量前使用包含要轉化類型的括號,這樣就對變量進行了強制類型轉化。
【實例】 顯示類型轉化的結果。在本實例中,通過不同類型變量之間的賦值,將賦值操作后的結果進行輸出,觀察類型轉化后的結果。
#include<stdio.h>
intmain()
{
charcChar;/*字符型變量*/
shortintiShort;/*短整型變量*/
intiInt;/*整型變量*/
floatfFloat=70000;/*單精度浮點型*/
cChar=(char)fFloat;/*強制轉化賦值*/
iShort=(short)fFloat;
iInt=(int)fFloat;
printf("thecharis:%c\n",cChar);/*輸出字符變量值*/
printf("thelongis:%ld\n",iShort);/*輸出短整型變量值*/
printf("theintis:%d\n",iInt);/*輸出整型變量值*/
printf("thefloatis:%f\n",fFloat);/*輸出單精度浮點型變量值*/
return0;/*程序結束*/
}
算數運算符與表達式
算術運算符
算術運算符包括:兩個單目運算符(正和負),5個雙目運算符乘法、除法、取模、加法和減法。具體符號和對應的功能如表所示。
在上述的算術運算符中,取模運算符(%)用于計算兩個整數相除得到的余數,并且取模運算符的兩側均為整數,例如7%4的結果是3。
算術表達式
在表達式中使用算術運算符,則將表達式稱為算術表達式。下面是一些算術表達式的例子,其中使用的運算符就是表4.1中所列出的算術運算符:
Number=(3+5)/Rate; Height=Top-Bottom+1; Area=Height*Width;
需要說明的是,兩個整數相除的結果為整數,例如7/4的結果為1,舍去的是小數部分。但是,如果其中的一個數是負數時會出現什么情況呢?此時機器會采取“向零取整”的方法,即為-1,取整后向0靠攏。
優先級與結合性
C語言中規定了各種運算符的優先級和結合性,首先來看一下有關算術運算的優先級:
算術運算符的優先級
在表達式求值時,先按照運算符的優先級別高低次序執行,算術運算符中*、/、%的優先級別高于+、-的級別。例如,如果在表達式中同時出現*和+,那么先運算乘法:
R=x+y*z;
在表達式中,因為*比+的優先級高,所以會先進行y*z的運算,最后加上x。
算術運算符的結合性
當算術運算符的優先級相同時,結合方向為“自左向右”。
例如:
a-b+c
因為減法和加法的優先級是相同的,所以b先與減號相結合,執行a-b的操作,然后執行加c的操作。這樣的操作過程就稱為“自左向右的結合性”,在后面的介紹中還可以看到“自右向左的結合性”。
自增自減運算符
在C語言中還有兩個特殊的運算符:自增運算符“++”和自減運算符“--”。自增運算符和自減運算符對變量的操作分別是增加1和減少1,
如表所示:
自增運算符和自減運算符可以放在變量的前面或者后面,放在變量前面稱為前綴,放在后面稱為后綴,使用的一般方法如下所示。
--Counter; /*自減前綴符號*/
Grade--; /*自減后綴符號*/
++Age; /*自增前綴符號*/
Height++; /*自增后綴符號*/
在上面這些例子中,運算符的前后位置不重要,因為所得到的結果是一樣的,自減就是減1,自增就是加1。
關系運算符與表達式
關系運算符包括大于運算符、大于等于運算符、小于運算符、小于等于運算符、等于運算符、不等于運算符。表中列出了這6種關系運算符所對應的符號。
關系運算符用于對兩個表達式的值進行比較,返回一個真值或者假值。返回真值還是假值取決于表達式中的值和所用的運算符。其中真值為1,假值為0,真值表示指定的關系成立,假值則表示指定的關系不正確。
例如:
7>5 /*因為7大于5,所以該關系成立,表達式的結果為真值*/
7>=5 /*因為7大于5,所以該關系成立,表達式的結果為真值*/
7<5 /*因為7大于5,所以該關系不成立,表達式的結果為假值*/
7<=5 /*因為7大于5,所以該關系不成立,表達式的結果為假值*/
7==5 /*因為7不等于5,所以該關系不成立,表達式的結果為假值*/
7!=5 /*因為7不等于5,所以該關系成立,表達式的結果為真值*/
關系運算符通常用來構造條件表達式,用在程序流程控制語句中,例如if語句是用于判斷條件而執行語句塊,在其中使用關系表達式作為判斷條件,如果關系表達式返回的是真值則執行下面的語句塊,如果為假值就不去執行。
代碼如下:
if(Count<10)
{
…/*判斷條件為真值,執行代碼*/
}
其中,if(iCount<10)就是判斷iCount小于10這個關系是否成立,如果成立則為真,如果不成立則為假。
優先級與結合性
關系運算符的結合性都是自左向右的。使用關系運算符的時候常常會判斷兩個表達式的關系,但是由于運算符存在著優先級的問題,因此如果不小心處理則會出現錯誤。例如要進行這樣的判斷操作:先對一個變量進行賦值,然后判斷這個賦值的變量是否不等于一個常數,
代碼如下:
if(Number=NewNum!=10)
{
…
}
因為“!=”運算符比“=”的優先級要高,所以NewNum!=0的判斷操作會在賦值之前實現,變量Number得到的就是關系表達式的真值或者假值,這樣并不會按照之前的意愿執行。
前文曾經介紹過括號運算符,括號運算符的優先級具有最高性,因此使用括號來表示要優先計算的表達式,例如:
if((Number=NewNum)!=10)
{
…
}
這種寫法比較清楚,不會產生混淆,沒有人會對代碼的含義產生誤解。由于這種寫法格式比較精確簡潔,因此被多數的程序員所接受。
邏輯運算符與表達式
使用邏輯運算符可以將多個關系表達式的結果合并在一起進行判斷。
其一般形式為:
表達式 邏輯運算符 表達式
例如使用邏輯運算符:
Result=Func1&&Func2;/*Func1和Func2都為真時,結果為真*/ Result=Func1||Func2;/*Func1、Func2其中一個為真時,結果為真*/ Result=!Func2;/*如果Func2為真,則Result為假*/
前面已經介紹過,但這里還要做重點強調,不要把邏輯與運算符“&&”和邏輯或運算符“||”與下面要講的位與運算符“&”和位或運算符“|”混淆。
邏輯與運算符和邏輯或運算符可以用于相當復雜的表達式中。一般來說,這些運算符用來構造條件表達式,用在控制程序的流程語句中,例如在后面章節中要介紹的if、for、while語句等。
在程序中,通常使用單目邏輯非運算符“!”把一個變量的數值轉化為相應的邏輯真值或者假值,也就是1或0。
例如:
Result= !!Value; /*轉化成邏輯值*/
“&&”和“||”是雙目運算符,它們要求有兩個操作數,結合方向自左至右;“!”是單目運算符,要求有一個操作數,結合方向自左向右。
邏輯運算符的優先級從高到低依次為:單目邏輯非運算符“!”,邏輯與運算符“&&”,邏輯或運算符“||”。
【實例4.8】 邏輯運算符的應用。在本實例中,使用邏輯運算符構造表達式,通過輸出顯示表達式的結果,根據結果分析表達式中邏輯運算符的計算過程。
#include<stdio.h>
intmain()
{
intiNumber1,iNumber2;/*聲明變量*/
iNumber1=10;/*為變量賦值*/
iNumber2=0;
printf("the1isTure,0isFalse\n");/*顯示提示信息*/
printf("5<iNumber1&&iNumber2is%d\n",5<iNumber1&&iNumber2);/*顯示邏輯與表達式的結果*/
printf("5<iNumber1||iNumber2is%d\n",5<iNumber1||iNumber2);/*顯示邏輯或表達式的結果*/
iNumber2=!!iNumber1;/*得到iNumber1的邏輯值*/
printf("iNumber2is%d\n",iNumber2);/*輸出邏輯值*/
return0;
}
位邏輯運算符與表達式
位邏輯運算符
位邏輯運算符包括:位邏輯與、位邏輯或、位邏輯非、取補。表列出了所有位邏輯運算符。
位邏輯表達式
在程序中,位邏輯運算符一般被程序員用作開關標志。較低層次的硬件設備驅動程序,經常需要對輸入輸出設備進行位操作。
如下位邏輯與運算符的典型應用,對某個語句的位設置進行檢查:
if(Field & BITMASK)
語句的含義是if語句對后面括號中的表達式進行檢測。如果表達式返回的是真值,則執行下面的語句塊,否則跳過該語句塊不執行。其中運算符用來對BITMASK變量的位進行檢測,判斷其是否與Field變量的位有相吻合之處。
逗號運算符與表達式
在C語言中,可以用逗號將多個表達式分隔開來。其中,用逗號分隔的表達式被分別計算,并且整個表達式的值是最后一個表達式的值。
逗號表達式稱為順序求值運算符。逗號表達式的一般形式為:
表達式1,表達式2 ,…,表達式n
逗號表達式的求解過程是:先求解表達式1,再求解表達式2,一直求解到表達式n。整個逗號表達式的值是表達式n的值。
觀察下面使用逗號運算符的代碼:
Value=2+5,1+2,5+7;
上面語句中Value所得到的值為7,而非12。整個逗號表達式的值不應該是最后一個表達式的值嗎?為什么不等于12呢?答案在于優先級的問題,由于賦值運算符的優先級比逗號運算符的優先級高,因此先執行的賦值運算。如果要先執行逗號運算,則可以使用括號運算符,代碼如下所示:
Value=(2+5,1+2,5+7);
使用括號之后,Value的值為12。
【實例4】 用逗號分隔的表達式。本實例中,通過逗號運算符將其他的運算符結合在一起形成表達式,再將表達式的最終結果賦值給變量。由顯示變量的值,分析逗號運算符的計算過程。
#include<stdio.h>
intmain()
{
intiValue1,iValue2,iValue3,iResult;/*聲明變量,使用逗號運算符*/
/*為變量賦值*/
iValue1=10;
iValue2=43;
iValue3=26;
iResult=0;
iResult=iValue1++,--iValue2,iValue3+4;/*計算逗號表達式*/
printf("theresultis:%d\n",iResult);/*將結果輸出顯示*/
iResult=(iValue1++,--iValue2,iValue3+4);/*計算逗號表達式*/
printf("theresultis:%d\n",iResult);/*將結果輸出顯示*/
return0;/*程序結束*/
}
復合賦值運算符
復合賦值運算符是C語言中獨有的,實際這種操作是一種縮寫形式,可使得變量操作的描述方式更為簡潔。例如在程序中為一個變量賦值:
Value=Value+3;
這個語句是對一個變量進行賦值操作,值為這個變量本身與一個整數常量3相加的結果值。使用復合賦值運算符可以實現同樣的操作。例如上面的語句可以改寫成:
Value+=3;
這種描述更為簡潔。關于上面兩種實現相同操作的語句,賦值運算符和復合賦值運算符的區別在于:
為了簡化程序,使程序精煉。 為了提高編譯效率。
對于簡單賦值運算符,如Func=Func+1中,表達式Func計算兩次;對于復合賦值運算符,如Func+=1中,表達式Func僅計算一次。一般來說,這種區別對于程序的運行沒有太大的影響。但是,如果表達式中存在某個函數的返回值,那么函數被調用兩次。
【實例】 使用復合賦值運算符簡化賦值運算。
#include<stdio.h>
intmain()
{
intiTotal,iValue,iDetail;/*聲明變量*/
iTotal=100;/*為變量賦值*/
iValue=50;
iDetail=5;
iValue*=iDetail;/*計算得到iValue變量值*/
iTotal+=iValue;/*計算得到iTotal變量值*/
printf("Valueis:%d\n",iValue);/*顯示計算結果*/
printf("Totalis:%d\n",iTotal);
return0;
}
總結
以上是生活随笔為你收集整理的C语言运算符与表达式实例分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言写个贪吃蛇游戏
- 下一篇: go语言中能用的编译器有哪些