前言:OC語言是C語言的基礎(chǔ)上發(fā)展起來的,所以沿用了C語言的運(yùn)算規(guī)則那伐。OC語言的運(yùn)算符不僅具有不同的優(yōu)先級(jí)踏施,而且還有一個(gè)特點(diǎn)石蔗,就是它的結(jié)合性。在表達(dá)式中畅形,各運(yùn)算量參與運(yùn)算的先后順序不僅要遵守運(yùn)算符優(yōu)先級(jí)別的規(guī)定养距,還要受運(yùn)算符結(jié)合性的制約,以便確定是自左向右進(jìn)行運(yùn)算還是自右向左進(jìn)行運(yùn)算日熬。這種結(jié)合性是其它高級(jí)語言的運(yùn)算符所沒有的棍厌,因此也增加了OC語言的復(fù)雜性。
1.算術(shù)運(yùn)算符
算術(shù)表達(dá)式:用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱操作數(shù))連接起來的竖席、符合C語法規(guī)則的式子耘纱。
算術(shù)運(yùn)算符:用于各類數(shù)值運(yùn)算。包括加(+)毕荐、減(-)束析、乘(*)、除(/)憎亚、求余(或稱模運(yùn)算员寇,%)、自增(++)第美、自減(–)共七種丁恭。
運(yùn)算符的優(yōu)先級(jí):C語言中,運(yùn)算符的運(yùn)算優(yōu)先級(jí)共分為15級(jí)斋日。1級(jí)最高牲览,15級(jí)最低。在表達(dá)式中恶守,優(yōu)先級(jí)較高的先于優(yōu)先級(jí)較低的進(jìn)行運(yùn)算第献。而在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí),則按運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理兔港。
運(yùn)算符的結(jié)合性:C語言中各運(yùn)算符的結(jié)合性分為兩種庸毫,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。例如算術(shù)運(yùn)算符的結(jié)合性是自左至右衫樊,即先左后右飒赃。如有表達(dá)式x-y+z則y應(yīng)先與“-”號(hào)結(jié)合,執(zhí)行x-y運(yùn)算科侈,然后再執(zhí)行+z的運(yùn)算载佳。這種自左至右的結(jié)合方向就稱為“左結(jié)合性”。而自右至左的結(jié)合方向稱為“右結(jié)合性”臀栈。 最典型的右結(jié)合性運(yùn)算符是賦值運(yùn)算符蔫慧。如x=y=z,由于“=”的右結(jié)合性,應(yīng)先執(zhí)行y=z再執(zhí)行x=(y=z)運(yùn)算权薯。C語言運(yùn)算符中有不少為右結(jié)合性姑躲,應(yīng)注意區(qū)別睡扬,以避免理解錯(cuò)誤。
加法運(yùn)算符”+“:加法運(yùn)算符為雙目運(yùn)算符黍析,即應(yīng)有兩個(gè)量參與加法運(yùn)算卖怜。如a+b,4+8等。具有左結(jié)合性阐枣。
減法運(yùn)算符”-“:減法運(yùn)算符為雙目運(yùn)算符马靠。但“-”也可作負(fù)值運(yùn)算符,此時(shí)為單目運(yùn)算侮繁,如-x,-5等。具有左結(jié)合性如孝。
乘法運(yùn)算符”*“:雙目運(yùn)算宪哩,具有左結(jié)合性。
除法運(yùn)算符”/“:雙目運(yùn)算第晰,具有左結(jié)合性锁孟。
注意:參與運(yùn)算量均為整型時(shí),運(yùn)算結(jié)果也為整型茁瘦,舍去小數(shù)品抽。如果運(yùn)算量中有一個(gè)是實(shí)型,則結(jié)果為雙精度實(shí)型甜熔。
求余運(yùn)算符(模運(yùn)算符)”%“:雙目運(yùn)算圆恤,具有左結(jié)合性。要求參與運(yùn)算的量均為整型腔稀。 求余運(yùn)算的結(jié)果等于兩數(shù)相除后的余數(shù)盆昙。
自增、自減運(yùn)算符:自增1運(yùn)算符記為”++“焊虏,其功能是使變量的值自增1淡喜。自減1運(yùn)算符記為”- -“,其功能是使變量值自減1诵闭。自增1炼团,自減1運(yùn)算符均為單目運(yùn)算,都具有右結(jié)合性疏尿∥林ィ可有以下幾種形式:
++i;//i自增1后再參與其它運(yùn)算。
--i;//i自減1后再參與其它運(yùn)算褥琐。
i++;//i參與運(yùn)算后模狭,i的值再自增1。
i--;//i參與運(yùn)算后踩衩,i的值再自減1嚼鹉。
注意:在理解和使用上容易出錯(cuò)的是i++和i- -贩汉。 特別是當(dāng)它們出在較復(fù)雜的表達(dá)式或語句中時(shí),常常難于弄清锚赤,因此應(yīng)仔細(xì)分析匹舞。不提倡自增運(yùn)算符和自減運(yùn)算符與其他運(yùn)算符混用,尤其不要出現(xiàn)下面這樣的代碼:
//嚴(yán)禁出現(xiàn)下面風(fēng)格的代碼
inti=1,j=1,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
這在C標(biāo)準(zhǔn)里线脚,叫做未定義行為赐稽,一切未定義行為的執(zhí)行后果都是不可知的,編譯器不會(huì)報(bào)錯(cuò)浑侥,但是會(huì)報(bào)警告姊舵。
2.數(shù)據(jù)類型轉(zhuǎn)換
強(qiáng)制類型轉(zhuǎn)換:
其一般形式為:?(類型說明符)? (表達(dá)式)
其功能是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說明符所表示的類型。
例如:
(float) ? ?a????? 把變量a轉(zhuǎn)換為浮點(diǎn)型
(int)(x + y)???? 把x+y的結(jié)果轉(zhuǎn)換為整型
強(qiáng)制類型轉(zhuǎn)換運(yùn)算符是一元運(yùn)算符寓落,行為和其他一元運(yùn)算符一樣括丁,并不會(huì)對(duì)變量本身的值造成改變,就像-a永遠(yuǎn)不會(huì)影響a的值伶选,因此史飞,(float) ?a也不會(huì)影響a的值。
隱式類型轉(zhuǎn)換:
浮點(diǎn)值賦給整型變量:數(shù)值的小數(shù)部分會(huì)被刪節(jié)仰税,整數(shù)部分不變构资。
整型值賦給浮點(diǎn)型變量:數(shù)值大小不發(fā)生變化,數(shù)據(jù)類型變成浮點(diǎn)型陨簇。
3.示例代碼
#import
intmain(intargc,constchar*argv[]){
@autoreleasepool{
inta=10,b=4;
floatc=2.0,d=1.5;
// 打印a, b, c, d的值
NSLog(@"a = %d, b = %d, c = %f, d = %f",a,b,c,d);
// 加法
NSLog(@"a + b = %d",a+b);
// 減法
NSLog(@"a - b = %d",a-b);
// 乘法
NSLog(@"a * b = %d",a*b);
// 除法
NSLog(@"a / b = %d",a/b);// 兩個(gè)整型相除吐绵,結(jié)果也為整型,小數(shù)部分舍去
NSLog(@"a / c = %f",a/c);// 參與運(yùn)算的量有浮點(diǎn)型時(shí)河绽,運(yùn)算結(jié)果也為浮點(diǎn)型
// 模運(yùn)算(取余)
NSLog(@"a %% b = %d",a%b);// NSLog中 %% 表示打印一個(gè) %拦赠,模運(yùn)算要求左右兩邊均為整型
// 自增(自減類似)
NSLog(@"a++ = %d",a++);// 先取值,后加1
NSLog(@"++b = %d",++b);// 先加1葵姥,后取值
// 強(qiáng)制類型轉(zhuǎn)換
NSLog(@"(float)(a + b) = %f",(float)(a+b));// 數(shù)值大小不發(fā)生變化荷鼠,數(shù)據(jù)類型變成浮點(diǎn)型。
NSLog(@"(int)(c + d) = %d",(int)(c+d));// 數(shù)值的小數(shù)部分會(huì)被刪節(jié)榔幸,整數(shù)部分不變允乐。
// 打印a, b, c, d的值
NSLog(@"a = %d, b = %d, c = %f, d = %f",a,b,c,d);
// 隱式類型轉(zhuǎn)換
intintResult;
intResult=d;// 將float類型的變量賦給int型變量,數(shù)值的小數(shù)部分會(huì)被刪節(jié)削咆。
NSLog(@"(intResult = d) --> intResult = %d",intResult);
floatfloatResult;
floatResult=a;// 將int型變量賦給float型變量牍疏,數(shù)值大小不發(fā)生變化,數(shù)據(jù)類型變成浮點(diǎn)型拨齐。
NSLog(@"(floatResult = a) --> floatResult = %f",floatResult);
}
return0;
}
運(yùn)行結(jié)果: