您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
知識點:運算符號的優(yōu)先級別;強制類型轉(zhuǎn)換的使用;
重要程度:★★★★
1、算術(shù)運算符與算術(shù)表達式
1、在C語言中,有下列五個基本的算術(shù)運算符:+、-、*、/和%,依次表示加、減、乘、除、求
余運算。(考得最多的是/ 和%符號?。。。?/p>
2、求余運算符%的運算對象只能是整型,即%左側(cè)的被除數(shù)與右側(cè)的除數(shù)都只能為整型值。
求余得到的運算結(jié)果的符號與被除數(shù)相同。(3%1.2錯了)
如:12%9運算結(jié)果為3,12%-9的運算結(jié)果也為3。
-12%9運算結(jié)果為-3,-12%-9的運算結(jié)果也為-3。
3、求余就是求余數(shù),而不是求商,這點總是容易被弄混淆。
² 想一想:3%9運算結(jié)果為多少??(結(jié)果為3而不是0)
4、1/2得到的數(shù)據(jù)是為0的,這個原則是當(dāng)除號“/“左右兩邊都為整數(shù)的時候,我們遵守取整丟小數(shù)的原則。那么如果希望1和2相除得到0.5,我們就可以用1.0/2,或者1/2.0,或者1.0/2.0都可以實現(xiàn)。
先面通過一個具體例子的分析,我們來徹底搞清楚算術(shù)運算符的運算規(guī)則。
例1:試求 1.6+3/2*1.2-3/2.0 的值
步驟: |
計算過程: |
說明: |
第一步: |
1.6+1*1.2-3/2.0 |
根據(jù)運算優(yōu)先級和結(jié)合的順序,先算3/2,注意到它們?yōu)檎蛿?shù)據(jù)相運算,因此結(jié)果應(yīng)為整數(shù)1,而不是1.5。 |
第二步: |
1.6+1.0*1.2-3.0/2.0 |
1*1.2為整型和實型數(shù)據(jù)相運算,因此,會把整型數(shù)據(jù)1轉(zhuǎn)換為對應(yīng)的實型數(shù)據(jù)1.0,再與1.2進行運算。同理,3變成3.0 |
第三步: |
1.6+1.2-1.5 |
分別計算出 1.0*1.2 和 3.0/2.0 的結(jié)果 |
第四步: |
2.8-1.5 |
同一優(yōu)先級的運算,從左到右依次進行 |
第五步: |
1.3 |
結(jié)果為1.3,而不是1.9 |
下面,大家自己算算,表達式3.6-5/2+1.2+5%2的值應(yīng)該是多少?
A)4.3 B)4.8 C)3.3 D)3.8
分析:根據(jù)表3列出的算術(shù)運算符優(yōu)先級,本題目應(yīng)先計算5/2與5%2得到2和1,然后再計算3.6-2+1.2+1,得到答案D。
2、強制類型轉(zhuǎn)換
在進行算術(shù)運算時,如果希望將某一運算量轉(zhuǎn)換成指定的類型,則可以利用強制類型轉(zhuǎn)換符。
強制類型轉(zhuǎn)換表達式為:(類型名)表達式
其中,“(類型名)”是強制類型轉(zhuǎn)換符,它將右邊表達式的類型轉(zhuǎn)換為括號中的類型。
強制類型轉(zhuǎn)換并不會改變右邊表達式的值,(類型名)表達式 這個整體產(chǎn)生了一個臨時值。
例:有如下代碼:
float a=3.8;
int b;
b=(int)a;
這段代碼把a強制轉(zhuǎn)化為整型數(shù)據(jù)3(注意C語言里的強制轉(zhuǎn)換都是截取,而不是四舍五入),并把這個值3賦給整型變量b。注意,此時a的值仍然是3.8。
強制轉(zhuǎn)換只控制其后的一個數(shù)據(jù)
例:(int ) a+b和(int ) (a+b)不同:
前者是把a強制轉(zhuǎn)換為整型,再把這個臨時的整型值和b作運算。
后者是先計算a+b,之后把它們的值做整體的強制轉(zhuǎn)換。
強制轉(zhuǎn)換需要注意的幾點:
1) 類型名外的()必不可少
2) 強制轉(zhuǎn)換控制其后的一個數(shù)據(jù)
3) 強制類型轉(zhuǎn)換并不會改變右邊表達式的值
知識點:賦值表達式的運算;復(fù)合賦值表達式的運算;自加和自減;
重要程度:★★★★★
1、賦值運算符和賦值表達式
int a = 12;
它的含義是將賦值運算符右邊的表達式的運算結(jié)果賦值給左邊的變量。
說明:
1)賦值運算符左邊必須是單個變量。例如x+1=3在數(shù)學(xué)上雖然是正確的,可是在C語言中卻
是錯誤的,不能將一個常量賦值給一個表達式。
2)賦值運算會將左邊變量的值用右邊表達式的值來代替,右邊的值不會改變。
例如,int x=3,y=5;
x=y+1;
以上代碼先將x初始化為3,將y初始化為5。執(zhí)行完賦值語句x=y+1;后,變量x的值被y+1覆蓋掉,即x的值變成了6,變量y的值不會改變。
用盒子理論來說就是,先定義了兩個盒子,分別叫做x盒子和y盒子,x盒子裝的是整數(shù)3,y盒子裝的是整數(shù)5。之后把x盒子所裝的內(nèi)容改成y盒子的內(nèi)容加1,也就是6。這樣,x盒子中裝的就是6了,以后再要使用x,都是用的新值6。而以前x裝過什么值現(xiàn)在再也不知道了。
3)賦值表達式的值是賦值號左邊變量被賦值后的值。
例如:x=0整個賦值表達式的值是變量x被賦值之后的值,也就是說這個表達式的值為0。
4)可以將賦值表達式的值再賦值給變量,形成連續(xù)賦值運算。(學(xué)會分析過程)
例如,x=(y=25)是一個連續(xù)賦值表達式。由于賦值表達式的結(jié)合形式是從右到左,因此可以簡寫為x=y=25,它表達的含義是將25賦值給變量y,然后將表達式y(tǒng)=25的值賦值,即變量y的值賦給變量x,結(jié)果使變量x和y的值都變?yōu)?5。
5)雖然可以連續(xù)賦值,但是不能連續(xù)初始化。(考試重點)
例如:int x=y=25; 就是錯誤的。
對于int x=y=25;我們會先計算y=25,此時,y并沒有定義,而是在直接使用,所以就會報錯。
如果我們把上面的連續(xù)初始化改成:int y; int x=y=25; 這樣就沒有錯了。
6)賦值運算符不同于數(shù)學(xué)上的“等號”。(C語言中“=”表示賦值,“= =”表示等號)
因為賦值運算符的操作是將賦值號右邊的表達式的值賦給左邊的變量。它是單方向的操作。例如在數(shù)學(xué)中,i=i+1不成立,但在賦值表達式中卻是成立的,它表示將變量i的值增加1之后得到的結(jié)果賦值給變量i,因此,該表達式的含義是使變量i的值增加1。
7)如果賦值號兩邊的運算對象類型不一致,則系統(tǒng)會自動進行類型轉(zhuǎn)換。
8)自動類型轉(zhuǎn)換的實例:int a=3.6;
賦值號左邊的變量類型是整數(shù),右邊的值是實數(shù),因此將右邊的值轉(zhuǎn)換成整數(shù)。3.6轉(zhuǎn)換成整數(shù)后是3,因此a的值被賦為了3。
注意:實數(shù)轉(zhuǎn)換成整數(shù)的方法是截取而不是四舍五入,因此直接把小數(shù)點后的數(shù)據(jù)去掉就行了。
2、復(fù)合賦值表達式(掌握如何計算即可)
在C語言中,可以將算術(shù)運算符與賦值運算符組合在一起組成復(fù)合賦值運算符。它們是:+=,-=,*=,/=,其使用方法及具體的運算規(guī)則如下:
表達式n+=100等價的表達式為:n=n+100
表達式n-=2*n等價的表達式為:n=n-2*n
表達式n*=m+1等價的表達式為:n=n*(m+1)
表達式n/=m+1等價的表達式為:n=n/(m+1)
上述四種復(fù)合賦值運算符的運算優(yōu)先級與賦值運算符的優(yōu)先級相同(優(yōu)先級都非常低),運算方向均為自右向左。
想一想:n+=10和n+10有什么區(qū)別?區(qū)別在于前者n本身的值改變了,而后者n的值沒有改變。
例1: 已知變量n的初始值為8,計算表達式n+=n*=n-2的值。(經(jīng)典考題)
分析:表達式中有兩個復(fù)合賦值運算符:+=和*=。它們優(yōu)先級相同,運算方向均為自右向左。因此,運算的步驟如下:
(1)先計算最右邊表達式n-2的值為6;
(2)再計算n*=6,該表達式等價n=n*6,將n中的值8乘以6,得到48,并賦值給n,因此變量n的值為48,表達式n*=n-2的值為48;
(3)最后計算n+=48,該表達式相當(dāng)于n=n+48。因為上一步計算出n的值為48,所以n+48的值為96,即n的值最終為96。
通過計算,表達式n+=n*=n-2的值為96。
例2:int a=5,b=6,c=2;
c *=a+b;
請問:c的值最終是多少?
錯誤的算法: c=c*a+b;得到的是16。
正確的算法: c=c*(a+b);得到的是22。
1、自加與自減運算符(超級重點)
如何讓一個變量自身的值加1?通過之前的學(xué)習(xí),我們知道a=a+1; 和 a+=1; 都可以實現(xiàn)。而我們將要討論的a++和++a同樣可以實現(xiàn)這樣的效果。
自加、自減運算是一種賦值運算。
既然a++和++a寫法上有區(qū)別,那么它們應(yīng)該有所不同。這里僅就++運算符進行說明,--運算符有類似的結(jié)論:
a++和++a的相同處:對于變量a而言,它們都是讓a的值加1。
a++和++a的不同處:( ++a)、(a++)是兩個自加表達式,所以這兩個表達式本身就有數(shù)值,只是++a,a++兩個的表達式的數(shù)值不同。
自加表達式的核心理解
|
² 遇到a++,就看成a,等這部分執(zhí)行結(jié)束后,再讓a的值加一。(加號在后,則先使用后自加)
² 遇到++a,則把a的值先加一,之后再使用加過一后的值。(加號在前,則先自加后使用)。
例如有以下代碼(通過以下代碼,學(xué)會分析a++和++a的執(zhí)行過程):
int a=3,b;
b=a++;
這段代碼執(zhí)行完后,b的值為3,a的值為4。
對于語句b=a++; 按照以上所說,我們就看成b=a; 此時a值為3,因此賦值后b的值也為3。等這部分執(zhí)行結(jié)束后,再讓a的值加一。因此,整個這段代碼結(jié)束后,b的值為3,a的值為4。
----------------------------------------------------------------------------------------------------------------------------------
int a=3, b;
b=++a,代碼發(fā)生了變化,那么執(zhí)行完后,a和b的值分別為多少呢?
對于語句b= ++a; 按照以上所說,我們把a值先加一,得到a的值為4。之后賦值給b。因此,整個這段代碼結(jié)束后,a、b的值都為4。
|
說明:
補充考點:
1)增量運算符的運算對象只能為單個變量,不能是常量或是表達式。例如:++3、++(i+1)
都是不合法的增量表達式。
2)不論“++”在變量的前面還是在變量的后面,對于變量本身都具有“增加1”的相同效果。
例如i++、++i兩個增量表達式運算后變量i的值都是增加1。
3)自加、自減運算符的結(jié)合方向是“從右到左”。
例如有如下代碼:
int y,x=3;
y=-x++;
負號“-”與自加運算符“++”具有相同的運算優(yōu)先級,但是根據(jù)“從右到左”的結(jié)合方向,那么應(yīng)該先計算x++,而x++可以先看成就是x。取其負值3賦給y,那么y的值就為-3,這部分執(zhí)行結(jié)束了,x的值再加一,所以這段代碼結(jié)束后,x的值為4,y的值為-3。
4)在使用“++”運算符時,變量應(yīng)該有個確定的值。例如:int a; a++; 就是錯誤的。因為剛定
義好的a值不確定。讓一個垃圾值自加一沒有任何意義。
經(jīng)典考題:
例1: 有以下定義語句:double a,b; int w; long c;
若各變量已正確賦值,則下列選項中正確的表達式是
A)a=a+b=b++ B)w%((int)a+b) C)(c+w)%(int)a D)w=a%b;
分析:答案C正確。
選項A是一個連續(xù)賦值表達式,先將表達式b++的值賦值給表達式a+b,因為賦值語句的左邊只能是變量名稱,因此這時會出錯。
選項B是一個求余運算符連接起來的兩個運算對象,除數(shù)((int)a+b)看起來比較復(fù)雜,它先將雙精度類型變量a的值強制轉(zhuǎn)換為整型,然后再與雙精度類型變量b求和,得到的值的類型仍為雙精度類型,也就是說除數(shù)是一個實數(shù)而不是整數(shù),因此不能使用%運算符,所以答案B錯誤。
選項C的被除數(shù)是兩個整型數(shù)相加,運算結(jié)果為整型,除數(shù)為(int)a,也為整型,答案C正確。
選項D中a%b錯誤。
例2 有以下程序
main()
{ int m=12,n=34;
printf("%d%d",m++,++n);
printf("%d%d\n",n++,++m);
}
程序運行后的輸出結(jié)果是
A)12353514 B)12353513 C)12343514 D)12343513
分析:在第一個printf輸出語句中,計算表達式m++時,其值為變量m的初始值,即12,因為執(zhí)行了表達式m++,變量m的值增加1,因此m的值變?yōu)?3。計算表達式++n 時,其值為變量n的初始值增加1,即35,因為計算了表達式++n,因此變量n的值增加1,為35。在第二個printf中,計算n++時,其值為n的初始值,即上一次計算得到的35,因為計算了n++,變量n的值增加1。計算++m時,其值為變量m的初始值增加1,即使上一次計算得到的m的值加上1,為14。因此本題答案為A。
5、逗號運算符和逗號表達式
1、在C語言中,逗號除了做分隔符,還可以作一種運算符——逗號運算符。用逗號運算符把兩個或兩個以上的表達式連接起來,可以構(gòu)成一個新的表達式,即逗號表達式。例如:
x=5,y=6,z=7 整個(x=5,y=6,z=7)是逗號表達式,他的數(shù)值等于7,
2、逗號運算符是級別最低的運算符號,比賦值還要低。
3、逗號運算符具有從左到右的結(jié)合性,即先計算第一個表達式,然后計算第二個表達式,直到最后一個表達式。最后一個表達式的值就是整個逗號表達式的值。上述的逗號表達式的值就是表達式z=7的值7。
x=5,y=6,z=7 是個逗號表達式,它的數(shù)值為7。x的數(shù)值為5。
x=(5,y=6,z=7) 是個逗號表達式,它的數(shù)值為7,x的數(shù)值為7。
.
例1: 有以下程序
main( )
{ int a1=3,a2=9;
printf("%d\n",(a1,a2));
}
以下敘述中正確的是
A)程序輸出3 B)程序輸出9
C)格式說明符不足,編譯出錯 D)程序運行時產(chǎn)生出錯信息
分析:函數(shù)體中首先變量初始化,變量a1、a2的值分別為3和9,接下來的printf輸出語句中,要輸出的項是(a1,a2),在此要明白輸出項是一個逗號表達式就不會選錯答案。逗號表達式a1,a2的值就是a2的值,因此本題的答案為B。
請注意它與printf("%d\n",a1,a2)的區(qū)別。
例2: 有以下程序(經(jīng)典考題)
main( )
{ int x,y,z;
x=y=1;
z=x++,y++,++y;
printf(“%d,%d,%d\n”,x,y,z);
}
程序運行后的輸出結(jié)果是
A)2,3,3 B)2,3,2 C)2,3,1 D)2,2,1
分析:函數(shù)體中首先定義了三個整型變量x,y和z,接下來,對變量x和y賦值為1。然后,仔細分析語句z=x++,y++,++y;,因為逗號運算符在所有運算符中的優(yōu)先級最低,因此賦值表達式應(yīng)該先于逗號表達式計算,所以上述逗號表達式語句由三個賦值表達式組成:z=x++、y++和++y。按逗號表達式的計算規(guī)則,從左至右依次計算每個表達式,故應(yīng)先計算x++,并將其值賦給變量z,z的值為1,因為計算了x++,x的值增加1,變?yōu)?;計算了y++和++y,變量y的值應(yīng)增加2,變?yōu)?。最后,程序
輸出x,y,z的值應(yīng)為2,3,1。本題答案為C。
補充:
int a=1,x;
x= (a++,a++,++a)后,x的數(shù)值為多少? x為3.
int a=1,x;
x= a++,a++,++a后,x的數(shù)值為多少? x為1
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08