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