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