第2章 數(shù)據(jù)類(lèi)型和運(yùn)算符
2.1 注釋
- 程序注釋是源代碼的一個(gè)重要部分户敬,對(duì)于一份規(guī)范的程序源代碼而言嫂易,注釋?xiě)?yīng)該占到源代碼的1/3以上计寇;
- 單行注釋
//
仙蚜; - 多行注釋
/*
注釋開(kāi)始和*/
注釋結(jié)束耀找,需要指出的是多行注釋不可以嵌套翔悠,在/**/
多行注釋代碼塊內(nèi)业崖,不能再次使用/**/
添加多行注釋?zhuān)?/li>
2.2 標(biāo)識(shí)符和變量
2.2.1 分隔符
Objective-C語(yǔ)言里的分號(hào)(;)蓄愁、花括號(hào)({})双炕、方括號(hào)([])、圓括號(hào)(())撮抓、空格妇斤、圓點(diǎn)(.)都具有特殊的分隔作用,因此被統(tǒng)稱(chēng)為分隔符丹拯。
分號(hào)
Objective-C語(yǔ)言里語(yǔ)句的分隔不是使用回車(chē)來(lái)完成的站超,而是采用分號(hào)(;)作為語(yǔ)句的分隔乖酬,因此顷编,每個(gè)Objective-C 語(yǔ)句必須使用分號(hào)作為結(jié)尾。Objective-C 程序允許一行書(shū)寫(xiě)多行語(yǔ)句剑刑,每個(gè)語(yǔ)句之間以分號(hào)隔開(kāi)即可媳纬,單從程序的可讀性角度來(lái)看,應(yīng)該避免在一行書(shū)寫(xiě)多個(gè)語(yǔ)句施掏;一個(gè)語(yǔ)句也可以跨多行钮惠,只要在最后結(jié)束的地方使用分號(hào)結(jié)束即可。花括號(hào)
花括號(hào)的作用就是定義一個(gè)代碼塊七芭,一個(gè)代碼塊指的就是" {" 和" }" 所包含的一段代碼素挽,代碼塊在邏輯上是一個(gè)整體。方括號(hào)
圓括號(hào)
空格
Objective-C 語(yǔ)言中的空格包含空格符(Space)狸驳、制表符(Tab) 和回車(chē)(Enter) 等预明。除此之外,Objective-C 源程序還會(huì)使用空格來(lái)合理縮進(jìn)代碼耙箍,從而提供更好的可讀性撰糠。圓點(diǎn)
2.2.2 標(biāo)識(shí)符規(guī)則
標(biāo)識(shí)符,就是用于給程序中變量辩昆、類(lèi)阅酪、方法命名的符號(hào)。規(guī)則如下:
- 標(biāo)識(shí)符可以由字母汁针、數(shù)字术辐、下畫(huà)線(_)和美元符($)組成,其中不能以數(shù)字開(kāi)頭施无;
- 標(biāo)識(shí)符不能是Objective-C 關(guān)鍵字辉词,但可以包含關(guān)鍵字;
- 標(biāo)識(shí)符不能包含空格猾骡;
- 標(biāo)識(shí)符只能包含美元符($)瑞躺,不能包含@隧魄、#等其他特殊字符;
- Objective-C語(yǔ)言是區(qū)分大小寫(xiě)的隘蝎。因此,abc 和Abe 是兩個(gè)不同的標(biāo)識(shí)符襟企;
2.2.3 Objective-C 關(guān)鍵字
- auto
- break
- case
- char
- const
- continue
- default
- do
- double
- else
- enum
- extern
- float
- for
- goto
- if
- int
- long
- register
- return
- short
- signed
- sizeof
- static
- struct
- switch
- typedef
- union
- unsigned
- void
- volatile
- while
2.3 數(shù)據(jù)類(lèi)型分類(lèi)
Objective-C語(yǔ)言其實(shí)就是C語(yǔ)言的超集嘱么,因此,它支待的數(shù)據(jù)類(lèi)型與C 基本相似顽悼,大致分類(lèi)如下:
數(shù)據(jù)類(lèi)型:
- 基本類(lèi)型
- 整型
- 字符型
- 浮點(diǎn)型
- float類(lèi)型
- double類(lèi)型
- 枚舉型
- 構(gòu)造類(lèi)型
- 數(shù)組類(lèi)型
- 結(jié)構(gòu)體類(lèi)型
- 共用體類(lèi)型
- 指針類(lèi)型
- 指針類(lèi)型既是C 語(yǔ)言最重要的數(shù)據(jù)類(lèi)型曼振,也是Objective-C 最重要的類(lèi)型,所有的系統(tǒng)類(lèi)蔚龙、自定義類(lèi)的本質(zhì)都是指針類(lèi)型冰评。
- 還有一種特殊的空類(lèi)型(null type), 空類(lèi)型就是nil 值的類(lèi)型,這種類(lèi)型沒(méi)有名稱(chēng)木羹。因?yàn)榭疹?lèi)型沒(méi)有名稱(chēng)甲雅,所以不可能聲明一個(gè)空類(lèi)型的變量,或?qū)⒆兞哭D(zhuǎn)換成空類(lèi)型坑填∨兹耍空引用(nil) 是空類(lèi)型變量唯一的值∑旯澹空引用nil可以轉(zhuǎn)換為任何引用類(lèi)型妖枚。
2.4 基本數(shù)據(jù)類(lèi)型
2.4.1 整型
- short int(簡(jiǎn)稱(chēng)short):在內(nèi)存中通常占16位,取值范圍:-2^15 ~ 2^15 - 1苍在;
- int:在內(nèi)存中通常占32位绝页,取值范圍:-2^31 ~ 2^31 - 1;
- long int(簡(jiǎn)稱(chēng)long):在內(nèi)存中通常占64位寂恬,取值范圍:-2^63 ~ 2^63 - 1续誉;
- long long:在內(nèi)存中通常占64位,取值范圍:-2^63 ~ 2^63 - 1初肉;
需要指出的是屈芜,Objective-C 并沒(méi)有硬性規(guī)定各種整型在內(nèi)存中所占的空間。通常來(lái)說(shuō)朴译,Objective-C 要求long long 型所占用的內(nèi)存空不小于long 型所占用的內(nèi)存空間井佑,long 型所占的內(nèi)存空間應(yīng)該不小千int 所占的內(nèi)存空間,int 型所占的內(nèi)存空間應(yīng)該不小于short 型所占用的內(nèi)存空間眠寿。
經(jīng)驗(yàn)證躬翁,在64位Mac系統(tǒng)上,iPhone 8 Plus盯拱,short占2字節(jié)盒发,int占4字節(jié)例嘱,long占8字節(jié),long long占8字節(jié)宁舰。
size_t stSize = sizeof(short);
size_t intSize = sizeof(int);
size_t ltSize = sizeof(long);
size_t llSize = sizeof(long long);
NSLog(@"\nshortSize = %zu\nintSize = %zu\nlongSize = %zu\nlonglongSize = %zu",stSize,intSize,ltSize,llSize);
打悠绰选:
shortSize = 2
intSize = 4
longSize = 8
longlongSize = 8
Objective-C 中整數(shù)常量有3 種表示方式:十進(jìn)制、八進(jìn)制和十六進(jìn)制蛮艰,其中八進(jìn)制的整
數(shù)常量以0開(kāi)頭腋腮,十六進(jìn)制的整數(shù)以0x或者0X開(kāi)頭,其中1015分別以af ( 此處的a~f不區(qū)分大小寫(xiě))來(lái)表示壤蚜。
// 以0開(kāi)頭的整數(shù)常量是八進(jìn)制的整數(shù)
int octalValue = 013;
// 以0x或者0X開(kāi)頭的整數(shù)常量是十六進(jìn)制的整數(shù)
int hexValue = 0x13;
NSLog(@"\noctalValue = %d\nhexValue = %d",octalValue,hexValue);
打蛹垂选:
octalValue = 11
hexValue = 19
Objective-C 還允許在上述4 種整型前面添加unsigned 關(guān)鍵詞,將它們變成無(wú)符號(hào)整型袜刷,無(wú)符號(hào)整型的最高位不是符號(hào)位聪富,而是數(shù)值位,因此無(wú)符號(hào)整數(shù)不能表示負(fù)數(shù)著蟹。但與此同時(shí)墩蔓,無(wú)符號(hào)整型的最大值比對(duì)應(yīng)的普通整型的最大值大一倍。比如萧豆,short int 的取值范圍是-2^15 ~ 2^15 - 1, 而unsigned short 的取值范圍則是0~2^16 - 1钢拧。
2.4.2 NSLog輸出函數(shù)及格式字符
使用NSLog()函數(shù)非常簡(jiǎn)單,它的第一個(gè)參數(shù)應(yīng)該是一個(gè)字符串常量炕横,該字符串中可使用%格式的占位符源内,這個(gè)占位符將會(huì)由對(duì)應(yīng)的變量填充。
%格式的占位符如下:
%d:以帶符號(hào)的十進(jìn)制形式輸出整數(shù)(正數(shù)不輸出符號(hào))份殿;
%o:以八進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不輸出0 前綴)膜钓;
%x:以十六進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不輸出0x 前綴);
%u:以無(wú)符號(hào)十進(jìn)制形式輸出整數(shù)卿嘲;
%c:以字符形式輸出颂斜,只輸出一個(gè)字符;
%s:輸出C 風(fēng)格的字符串拾枣;
%f:以小數(shù)形式輸出浮點(diǎn)數(shù)沃疮,默認(rèn)輸出6 位小數(shù);
%e:以指數(shù)形式輸出浮點(diǎn)數(shù)梅肤,數(shù)字部分默認(rèn)輸出6 位小數(shù)司蔬;
%g:自動(dòng)選用%f 或%e 其中之一,保證輸出寬度較短的格式姨蝴,并且不會(huì)輸出無(wú)意義的0俊啼;
%p:以十六進(jìn)制形式輸出指針變量所代表的地址值;
%@:輸出Objective-C 的對(duì)象左医;
-
%zu:C99 授帕,輸出 size_t 類(lèi)型
/* 32位 */ typedef unsigned int size_t; typedef int ssite_t; /* 64位 */ typedef unsigned long size_t; typedef long ssize_t;
在%與格式字符之間同木,還可插入如下附加符:
- l (字母):可在格式字符d、o跛十、x彤路、u 之前,用于輸出長(zhǎng)整型整數(shù)芥映,比如%ld洲尊;也可在f、e屏轰、g 之前,用于輸出長(zhǎng)浮點(diǎn)型數(shù)憋飞;
- m (代表一個(gè)正整數(shù)):指定輸出數(shù)據(jù)所占的最小寬度霎苗;
- .n:對(duì)于浮點(diǎn)數(shù),表示輸出n 位小數(shù)榛做;對(duì)于字符串唁盏,表示截取的字符個(gè)數(shù);
- -:表示輸出的數(shù)值向左邊對(duì)齊检眯;
int a = 56;
NSLog(@"==%d==" , a);
NSLog(@"==%9d==" , a); // 輸出整數(shù)占9位
NSLog(@"==%09d==" , a); // 輸出整數(shù)占9位厘擂,前邊空位用0代替
NSLog(@"==%-9d==" , a); // 輸出整數(shù)占9位,并且左對(duì)齊
NSLog(@"=%o==", a); // 輸出八進(jìn)制數(shù)
NSLog(@"==%x==", a); // 輸出十六進(jìn)制數(shù)
long b = 56;
NSLog(@"%ld" , b); // 輸出long int 型的整數(shù)
double dl = 2.3;
NSLog(@"==%f==" , dl); // 以小數(shù)形式輸出浮點(diǎn)數(shù)
NSLog(@"==%e==" , dl); // 以指數(shù)形式輸出浮點(diǎn)數(shù)
NSLog(@"==%g==" , dl); // 以最簡(jiǎn)形式輸出浮點(diǎn)數(shù)
NSLog(@"==%9f==" , dl); // 以小數(shù)形式輸出浮點(diǎn)數(shù)锰瘸,并且最少占用9位
NSLog(@"==%9.4f==" , dl); // 以小數(shù)形式輸出浮點(diǎn)數(shù)刽严,至少占用9位,小數(shù)點(diǎn)共4位
NSLog(@"==%9lf==" , dl); // 以小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)避凝,并且最少占用9位
NSLog(@"==%9.4lf==", dl); // 以小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)舞萄,至少占用9位,小數(shù)點(diǎn)共4位
打庸芟鳌:
2019-02-17 16:02:37.414651+0800 StudyDemoProjectDemo[478:51240] ==56==
2019-02-17 16:02:47.162964+0800 StudyDemoProjectDemo[478:51240] == 56==
2019-02-17 16:02:47.162964+0800 StudyDemoProjectDemo[478:51240] ==000000056==
2019-02-17 16:02:50.546915+0800 StudyDemoProjectDemo[478:51240] ==56 ==
2019-02-17 16:02:53.770814+0800 StudyDemoProjectDemo[478:51240] =70==
2019-02-17 16:02:54.635277+0800 StudyDemoProjectDemo[478:51240] ==38==
2019-02-17 16:02:57.499029+0800 StudyDemoProjectDemo[478:51240] 56
2019-02-17 16:03:00.236972+0800 StudyDemoProjectDemo[478:51240] ==2.300000==
2019-02-17 16:03:02.469281+0800 StudyDemoProjectDemo[478:51240] ==2.300000e+00==
2019-02-17 16:03:03.746471+0800 StudyDemoProjectDemo[478:51240] ==2.3==
2019-02-17 16:03:06.426914+0800 StudyDemoProjectDemo[478:51240] == 2.300000==
2019-02-17 16:03:29.924144+0800 StudyDemoProjectDemo[478:51240] == 2.3000==
2019-02-17 16:03:38.167223+0800 StudyDemoProjectDemo[478:51240] == 2.300000==
2019-02-17 16:03:42.453096+0800 StudyDemoProjectDemo[478:51240] == 2.3000==
2.4.3 字符型
字符型通常用于表示單個(gè)的字符倒脓,字符常量必須使用單引號(hào)(')引起來(lái)。Objective-C 的每個(gè)字符只占一字節(jié)含思,因此崎弃,單個(gè)的Objective-C 字符變量并不支待中文字符,中文字符占2個(gè)字節(jié)含潘。
- 直接通過(guò)單個(gè)字符來(lái)指定字符常量:例如'A'饲做、'9'和'O'等;
- 通過(guò)轉(zhuǎn)義字符表示特殊字符常量:例如'\n'遏弱、'\t'等艇炎;
轉(zhuǎn)義字符如下:
-
\b
:退格符; -
\n
:換行符腾窝; -
\r
:回車(chē)符enter缀踪; -
\t
:制表符tab居砖; -
\"
:雙引號(hào); -
\'
驴娃;單引號(hào)奏候; -
\\
;反斜線唇敞;
不僅如此蔗草,char 類(lèi)型的值也可直接作為整數(shù)型的值來(lái)使用,但它是一個(gè)8位的無(wú)符號(hào)整數(shù)疆柔,即全部是正數(shù)咒精,取值范圍是0-255。如果把一個(gè)在0~255范圍內(nèi)的int整數(shù)賦給char類(lèi)型的變量旷档,系統(tǒng)會(huì)自動(dòng)把這個(gè)int整數(shù)當(dāng)成char 類(lèi)型來(lái)處理模叙。
2.4.4 浮點(diǎn)型
浮點(diǎn)類(lèi)型有3種:float、double 和long double, 一般來(lái)說(shuō)鞋屈,float 型占用4 字節(jié)范咨,double型變量占8 字節(jié);而long double 則占16 字節(jié)(iPhone 8plus測(cè)試是8字節(jié))厂庇;
Objective-C 的浮點(diǎn)數(shù)有兩種表示形式
- 十進(jìn)制數(shù)形式:這種形式就是平常簡(jiǎn)單的浮點(diǎn)數(shù)渠啊,例如,5.12, 512.0, .512权旷。浮點(diǎn)數(shù)必須包含一個(gè)小數(shù)點(diǎn)替蛉,否則會(huì)被當(dāng)成int 類(lèi)型處理;
- 科學(xué)計(jì)數(shù)法形式:例如拄氯,5.12e2 (即5.12 * 10^2)灭返、 5.12E2 (也是5.12 * 10^2);
必須指出的是,只有浮點(diǎn)類(lèi)型的數(shù)值才可以使用科學(xué)計(jì)數(shù)形式表示坤邪。例如熙含,51200 是一個(gè)int 類(lèi)型的值,但512E2 則是浮點(diǎn)型的值艇纺。
除此之外怎静,Objective-C 還提供了3 個(gè)特殊的浮點(diǎn)型數(shù)值:正無(wú)窮大、負(fù)無(wú)窮大和非數(shù)黔衡,例如蚓聘,使用一個(gè)正數(shù)除以0.0 將得到正無(wú)窮大,使用一個(gè)負(fù)數(shù)除以0.0 將得到負(fù)無(wú)窮大盟劫,0.0除以0.0 或?qū)σ粋€(gè)負(fù)數(shù)開(kāi)方將得到一個(gè)非數(shù)夜牡。必須指出的是,所有的正無(wú)窮大數(shù)值都相等,所有的負(fù)無(wú)窮大數(shù)值都相等塘装;而非數(shù)不與任何數(shù)值相等急迂,甚至和非數(shù)自己都不相等。
double d = 512000.f;
double num1 = d/0.0f;
double num2 = -d/0.0f;
double num3 = 0.0f/0.0f;
NSLog(@"正無(wú)窮大inf=%g",num1);
NSLog(@"負(fù)無(wú)窮大-inf=%g",num2);
NSLog(@"非數(shù)nan=%g",num3);
NSLog(@"正無(wú)窮大比較%d",num1==1/0.0f);
NSLog(@"負(fù)無(wú)窮大比較%d",num2==-1/0.0f);
NSLog(@"非數(shù)比較%d",num3==num3);
打颖碾取:
2019-02-17 18:06:51.406790+0800 StudyDemoProjectDemo[563:72926] 正無(wú)窮大inf=inf
2019-02-17 18:06:51.407105+0800 StudyDemoProjectDemo[563:72926] 負(fù)無(wú)窮大-inf=-inf
2019-02-17 18:06:51.407216+0800 StudyDemoProjectDemo[563:72926] 非數(shù)nan=nan
2019-02-17 18:06:51.407306+0800 StudyDemoProjectDemo[563:72926] 正無(wú)窮大比較1
2019-02-17 18:06:51.407387+0800 StudyDemoProjectDemo[563:72926] 負(fù)無(wú)窮大比較1
2019-02-17 18:06:51.407468+0800 StudyDemoProjectDemo[563:72926] 非數(shù)比較0
2.4.5 枚舉型
-
枚舉類(lèi)型定義
enum season { spring = 4, summer, fall, winter }; // 使用枚舉值 enum season mySeason; mySeason = summer; // 把枚舉值當(dāng)成無(wú)符號(hào)整數(shù)執(zhí)行輸出
NSLog(@"mySeason 的值:%u" , mySeason);
```
-
定義匿名枚舉類(lèi)型時(shí)直接定義變量
enum {male, female} me, you;
上面代碼中定義了一個(gè)匿名枚舉類(lèi)型僚碎,并在定義該枚舉類(lèi)型時(shí)定義了兩個(gè)變量:me和you,這兩個(gè)變量都只能等于male 或female 其中之一。
關(guān)于枚舉值的幾點(diǎn)說(shuō)明:
- 定義枚舉時(shí){}中列出來(lái)的枚舉值阴幌,也稱(chēng)為枚舉常量或枚舉元素勺阐,這些枚舉值不是變量,因此不能對(duì)它們賦值矛双。實(shí)際上渊抽,每個(gè)枚舉常量按它們的定義順序,依次為0议忽、l 懒闷、2、3,以此類(lèi)推徙瓶。當(dāng)然也可顯式指定枚舉常量的值毛雇;
- 枚舉常量的本質(zhì)就是無(wú)符號(hào)整數(shù)嫉称,因此侦镇,枚舉值可以用來(lái)比較大小。比較大小的規(guī)則就是它們實(shí)際的整數(shù)值织阅;
- 枚舉值的本質(zhì)是無(wú)符號(hào)整數(shù)壳繁,因此,Objective-C 允許直接將整數(shù)值賦值給枚舉變量荔棉,甚至可以直接把枚舉變量當(dāng)成整數(shù)使用闹炉,比如,用它們來(lái)參與四則混合運(yùn)算润樱;
需要指出的是渣触,雖然可以用整數(shù)值來(lái)代替枚舉值,但實(shí)際編程中盡量不要使用整數(shù)值來(lái)代替枚舉值壹若,也不要使用枚舉值來(lái)代替整數(shù)值-畢竟枚舉值具有更好的可讀性嗅钻。
2.4.6 BOOL類(lèi)型
Objective-C 提供了一個(gè)BOOL 類(lèi)型,BOOL 類(lèi)型的值有YES 和NO 兩個(gè)值店展,分別代表真和假养篓。但需要指出的是,Objective-C 底層實(shí)際上使用signed char 來(lái)代表BOOL赂蕴。而YES柳弄、NO兩個(gè)值的底層其實(shí)就是1 和0。對(duì)于C 語(yǔ)言而言概说,所有的非零數(shù)都會(huì)被當(dāng)成真碧注,因此嚣伐,YES 也會(huì)被當(dāng)成真處理;而NO 的值是0, 因此应闯,NO 也會(huì)被當(dāng)成假處理纤控。
2.5 類(lèi)型轉(zhuǎn)換
有兩種類(lèi)型轉(zhuǎn)換方式:自動(dòng)類(lèi)型轉(zhuǎn)換和強(qiáng)制類(lèi)型轉(zhuǎn)換。
2.5.1 自動(dòng)類(lèi)型轉(zhuǎn)換
如果系統(tǒng)支待把某個(gè)基本類(lèi)型的值直接賦給另一個(gè)基本類(lèi)型的變量碉纺,則這種方式被稱(chēng)為自動(dòng)類(lèi)型轉(zhuǎn)換船万。自動(dòng)轉(zhuǎn)換規(guī)則如下:
把整型類(lèi)型(包括字符型)的變量和值賦值給浮點(diǎn)型變量,不會(huì)有太大的變化骨田;
把浮點(diǎn)型類(lèi)型的變量和值賦值給整型(包括字符型)變量耿导,數(shù)值的小數(shù)部分會(huì)被直接舍棄;
-
當(dāng)把取值范圍大的變量值賦給取值范圍小的變量時(shí)态贤,可能發(fā)生溢出舱呻;
比如將int型變量33000賦值給short型變量時(shí),short的取值范圍是(-32768~32767)悠汽,就會(huì)發(fā)生溢出箱吕,強(qiáng)制類(lèi)型轉(zhuǎn)換為16 位的short 類(lèi)型,則需要截?cái)嗲懊?6 位柿冲,只保留后16 位茬高,余下16 位中最左邊的是符號(hào)位。
當(dāng)把取值范圍大的變量或值轉(zhuǎn)換為取值范圍小的類(lèi)型時(shí)假抄,必須格外小心怎栽,因?yàn)榉浅H菀滓鹦畔G失。
2.5.2 強(qiáng)制類(lèi)型轉(zhuǎn)換
強(qiáng)制類(lèi)型轉(zhuǎn)換的運(yùn)算符是圓括號(hào)()宿饱。
// 將浮點(diǎn)型強(qiáng)制轉(zhuǎn)換成int型進(jìn)行計(jì)算
int a = (int)2.3 + (int)122.2;
2.5.3 表達(dá)式類(lèi)型的自動(dòng)提升
當(dāng)一個(gè)算術(shù)表達(dá)式中包含多個(gè)基本類(lèi)型的值時(shí)熏瞄,整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類(lèi)型將發(fā)生自動(dòng)提升:
- 所有的short 型、char 型將被提升到int 型谬以;
- 整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類(lèi)型自動(dòng)提升到與表達(dá)式中最高等級(jí)操作數(shù)同樣的類(lèi)型强饮;
- 操作數(shù)的等級(jí)排列為short<int<long<long long<float<double<long double;
2.6 運(yùn)算符
Objective-C 語(yǔ)言中的運(yùn)算符可分為如下幾種:
- 算術(shù)運(yùn)算符
- 賦值運(yùn)算符
- 比較運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
- 類(lèi)型相關(guān)運(yùn)算符
2.6.1 算術(shù)運(yùn)算符
+:加法運(yùn)算符为黎,+還可以作為字符串的連接運(yùn)算符邮丰;
-:減法運(yùn)算符,還可以作為求負(fù)的運(yùn)算符號(hào)碍舍;
*:乘法運(yùn)算符柠座;
/:除法運(yùn)算法;
除法運(yùn)算符有些特殊片橡,如果除法運(yùn)算符的兩個(gè)運(yùn)算數(shù)都是整數(shù)類(lèi)型妈经,則計(jì)算結(jié)果也是整數(shù),就是將自然除法的結(jié)果截?cái)嗳≌纾?9/4 的結(jié)果是4,而不是5吹泡。%:求余運(yùn)算符骤星;
它要求運(yùn)算符兩邊的操作數(shù)都必須是整數(shù),它的計(jì)算結(jié)果是使用第一個(gè)運(yùn)算數(shù)來(lái)除以第二個(gè)運(yùn)算數(shù)(不可以為0)爆哑,得到一個(gè)整除的結(jié)果后洞难,剩下的值就是余數(shù)。-
++:自加揭朝;
這是一個(gè)單目運(yùn)算符队贱,運(yùn)算符既可以出現(xiàn)在操作數(shù)的左邊,也可以出現(xiàn)在操作數(shù)的右邊潭袱,但出現(xiàn)在左邊和右邊的效果是不一樣的柱嫌。如果把++放在左邊,則先把操作數(shù)加1, 然后才把操作數(shù)放入表達(dá)式中參與運(yùn)算屯换,如果把++放在右邊编丘,則先把操作數(shù)放入表達(dá)式中參與運(yùn)算,然后才把操作數(shù)加1, 看如下代碼:int e = 1; int f = e++ + 6; NSLog(@"e = %d, f = %d",e,f); e = 1; f = ++e + 6; NSLog(@"e = %d, f = %d",e,f); 打油凇: 2019-02-17 19:09:44.544752+0800 StudyDemoProjectDemo[607:80323] e = 2, f = 7 2019-02-17 19:09:51.456103+0800 StudyDemoProjectDemo[607:80323] e = 2, f = 8
--:自減嘉抓;
也是一個(gè)單目運(yùn)算符,效果與++基本相似晕窑,只是將操作數(shù)的值減1抑片。
2.6.2 賦值運(yùn)算符
Objective-C 使用" = " 作為賦值運(yùn)算符。值得指出的是幕屹,賦值表達(dá)式是有值的蓝丙,賦值表達(dá)式的值就是右邊被賦的值级遭。例如望拖,NSString *str2 = str 表達(dá)式的值就是str。因此挫鸽,賦值運(yùn)算符支持連續(xù)賦值说敏,通過(guò)使用多個(gè)賦值運(yùn)算,可以一次為多個(gè)變量賦值:
int a;
int b;
a = b = 7;
Objective-C 雖然支持一次為多個(gè)變量賦值的寫(xiě)法丢郊,但這種寫(xiě)法會(huì)導(dǎo)致程序的可讀性降低盔沫,因此不推薦這樣寫(xiě)。
2.6.3 位運(yùn)算符
Objective-C 支持的位運(yùn)算符有如下:
- &:按位與枫匾;
- |:按位或架诞;
- ~:按位非;
- ^ :按位異或干茉;
- <<:左位移運(yùn)算符谴忧;
-
>>
:右位移運(yùn)算符;
第1運(yùn)算數(shù) | 第2個(gè)運(yùn)算數(shù) | 按位與 | 按位或 | 按位異或 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
提示:
所有的數(shù)字在計(jì)算機(jī)底層都是以二進(jìn)制形式存在的,原碼是直接將一個(gè)數(shù)值轉(zhuǎn)換成二進(jìn)制數(shù)沾谓。但計(jì)算機(jī)以補(bǔ)碼的形式保存所有的整數(shù)委造。補(bǔ)碼的計(jì)算規(guī)則如下:正數(shù)的補(bǔ)碼和原碼完全相同,負(fù)數(shù)的補(bǔ)碼是其反碼+1均驶;反碼是對(duì)原碼按位取反昏兆,只是最高位(符號(hào)位)保持不變。負(fù)數(shù)補(bǔ)碼求原碼:補(bǔ)碼符號(hào)位不變妇穴,補(bǔ)碼-1爬虱,再取反就是原碼。
例子:
-
非運(yùn)算
short a1 = -5; NSLog(@"~a1=%d",~a1); 打犹谒: ~a1=4 原理解析: -5的原碼: 10000000 00000101 -5的反碼: 11111111 11111010 -5的補(bǔ)碼: 11111111 11111011 -5非運(yùn)算: 00000000 00000100(符號(hào)位0是正數(shù)饮潦,數(shù)值=4)
-
異或運(yùn)算
short b1 = 5; short c1 = 9; NSLog(@"b1^c1=%d",b1^c1); 打印: b1^c1=12 原理分析: 5的補(bǔ)碼: 00000000 00000101 9的補(bǔ)碼: 00000000 00001001 異或運(yùn)算:00000000 00001100(12)
位移運(yùn)算符:
左移運(yùn)算符是將運(yùn)算數(shù)的二進(jìn)制碼整體左移指定位數(shù)携狭,左移后右邊空出來(lái)的位以0 來(lái)填充继蜡;
右移運(yùn)算符為:>>,對(duì)于>>運(yùn)算符而言逛腿,把第一個(gè)操作數(shù)的二進(jìn)制碼右移指定位數(shù)后稀并,左邊空出來(lái)的位以原來(lái)的符號(hào)位來(lái)填充。即如果第一個(gè)操作數(shù)原來(lái)是正數(shù)单默,則左邊補(bǔ)0; 如果第一個(gè)操作數(shù)原來(lái)是負(fù)數(shù)碘举,則左邊補(bǔ)1。
例子:
- 位移運(yùn)算
NSLog(@"5<<2=%d",5<<2);
NSLog(@"-5<<2=%d",-5<<2);
NSLog(@"5>>2=%d",5>>2);
NSLog(@"-5>>2=%d",-5>>2);
打痈槔:
5<<2=20
-5<<2=-20
5>>2=1
-5>>2=-2
原理分析:(以short類(lèi)型為例)
5的原碼: 00000000 00000101
5的補(bǔ)碼: 00000000 00000101
5<<2: 00000000 00010100(20)
5>>2: 00000000 00000001(1)
-5的原碼: 10000000 00000101
-5的反碼: 11111111 11111010
-5的補(bǔ)碼: 11111111 11111011
-5<<2補(bǔ)碼: 11111111 11101100
-5<<2反碼: 11111111 11101011
-5<<2原碼: 10000000 00010100(-20)
-5>>2補(bǔ)碼: 11111111 11111110
-5>>2反碼: 11111111 11111101
-5>>2原碼: 10000000 00000010(-2)
特殊:
1<<0(1)
1<<1(2)
1<<2(4)
1<<3(8)
總結(jié):
當(dāng)進(jìn)行位移運(yùn)算時(shí)引颈,不難發(fā)現(xiàn),左移n位就相當(dāng)于乘以2的n次方境蜕,右移則是除以2的n次方(如果不能整除蝙场,實(shí)際返回的結(jié)果為小于除法結(jié)果的最大整數(shù))不僅如此,進(jìn)行位移運(yùn)算不會(huì)改變操作數(shù)本身粱年,它只是得到了一個(gè)新的運(yùn)算結(jié)果售滤, 而原來(lái)的操作數(shù)本身是不會(huì)改變的。
2.6.4 擴(kuò)展后的賦值運(yùn)算符
賦值運(yùn)算符可與算術(shù)運(yùn)算符台诗、位移運(yùn)算符結(jié)合完箩,擴(kuò)展成為功能更加強(qiáng)大的運(yùn)算符。
-
+=
拉队; x += y弊知,對(duì)應(yīng)x = x + y; -
-=
粱快; -
*=
秩彤; -
/=
夺鲜; -
%=
; -
|=
呐舔; -
&=
币励; -
^=
; -
<<=
珊拼; -
>>=
食呻;x>>=y,對(duì)應(yīng)x = x>>y澎现;
2.6.5 比較運(yùn)算符
比較運(yùn)算符用于判斷兩個(gè)變量或常量的大小仅胞,比較運(yùn)算的結(jié)果是整數(shù)值(1 代表真、0 代表假)
-
>
剑辫; -
>=
干旧; - <;
- <=妹蔽;
- ==椎眯;
如果進(jìn)行比較的兩個(gè)操作數(shù)都是數(shù)值型,即使它們的數(shù)據(jù)類(lèi)型不相同胳岂,只要它們的值相等编整,都將返回1。例如乳丰,97==
'a'返回1掌测; 5.0 = 5也返回1。 - !=产园;
如果進(jìn)行比較的兩個(gè)操作數(shù)都是數(shù)值型汞斧,無(wú)論它們的數(shù)據(jù)類(lèi)型是否相同,只要它們的值不相等什燕,都將返回1粘勒。
2.6.6 邏輯運(yùn)算符
邏輯運(yùn)算符用于操作兩個(gè)布爾型的變量或常量。
&&
(與)秋冰;必須前后兩個(gè)操作數(shù)都是真才返回真仲义,否則返回假婶熬。||
(或)剑勾;只要兩個(gè)操作數(shù)中有一個(gè)真,就可以返回真赵颅,否則返回假虽另。-
!
(非);只需要一個(gè)操作數(shù)饺谬,如果操作數(shù)為真捂刺,返回假谣拣;如果操作數(shù)為假,返回真族展。需要指出的是森缠,Objective-C 并沒(méi)有提供表示真、假的布爾型數(shù)據(jù)仪缸,Objective-C 通常會(huì)用1 代表真贵涵,用0 代表假。除此之外恰画,Objective-C 會(huì)把任意非0 的數(shù)值當(dāng)成真宾茂,0 才會(huì)被當(dāng)成假。!5的值為0拴还。
^
(異或)跨晴;當(dāng)兩個(gè)操作數(shù)不同時(shí)才返回真,如果兩個(gè)操作數(shù)相同片林,則返回假端盆。
2.6.7 逗號(hào)運(yùn)算符
Objective-C 提供了逗號(hào)運(yùn)算符,用于將多個(gè)表達(dá)式”連接”起來(lái)费封,而整個(gè)逗號(hào)表達(dá)式將返回最后一個(gè)表達(dá)式的值爱谁。語(yǔ)法格式如下:
表達(dá)式1, 表達(dá)式2, 表達(dá)式3, ... , 表達(dá)式n
當(dāng)我們需要將逗號(hào)表達(dá)式的值賦給指定變量時(shí),千萬(wàn)不要忘了把整個(gè)逗號(hào)表達(dá)式用圓括號(hào)括起來(lái)孝偎。
int a = (3 * 4, 5 > 2)
a的值為1
需要指出的是访敌,并不是所有出現(xiàn)逗號(hào)的地方都是逗號(hào)表達(dá)式,比如前面程序中常用的輸出語(yǔ)句:NSLog(@"%d, %d" , a, b);, 這條輸出語(yǔ)句中的逗號(hào)只是用于分隔向NSLog()函數(shù)傳入的多個(gè)參數(shù)衣盾,并不是逗號(hào)表達(dá)式寺旺。
2.6.8 三目運(yùn)算符
三目運(yùn)算符(?:)語(yǔ)法格式:
(expression) ? if-true-statement : if-false-statement;
三目運(yùn)算符的規(guī)則是:先對(duì)邏輯表達(dá)式expression 求值,如果邏輯表達(dá)式返回真势决,則執(zhí)行并返回第二個(gè)操作數(shù)的值阻塑,如果邏輯表達(dá)式返回假,則執(zhí)行并返回第三個(gè)操作數(shù)的值果复。
2.6.9 運(yùn)算符的結(jié)合性和優(yōu)先級(jí)
Objective-C 語(yǔ)言中的大部分運(yùn)算符也是從左向右結(jié)合的陈莽,只有單目運(yùn)算符、賦值運(yùn)算符和三目運(yùn)算符例外虽抄,其中走搁,單目運(yùn)算符、賦值運(yùn)算符和三目運(yùn)算符是從右向左結(jié)合的迈窟,也就是它們是從右向左運(yùn)算的私植。
運(yùn)算符的優(yōu)先級(jí):
- 分隔符:
. () [] {} ->
; - 單目運(yùn)算符:
++ -- ~ ! *(取變量運(yùn)算符) &(取地址運(yùn)算符) sizeof
车酣; - 強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符:
(type)
曲稼; - 乘法/除法/求余:
* / %
索绪; - 加法/減法:
+ -
; - 移位運(yùn)算符:
<< >>
贫悄; - 關(guān)系運(yùn)算符:
< <= > >=
瑞驱; - 等價(jià)運(yùn)算符:
== !=
; - 按位與:
&
窄坦; - 按位異或:
^
钱烟; - 按位或:
|
; - 條件與:
&&
嫡丙; - 條件或:
||
拴袭; - 三目運(yùn)算符:
?:
; - 賦值:
= += -= *= /= &= |= ^= %= <<= >>=
曙博; - 逗號(hào)運(yùn)算符:
,
拥刻;
雖然Objective-C 運(yùn)算符存在這種優(yōu)先級(jí)的關(guān)系,但并不推薦過(guò)度依賴(lài)這種運(yùn)算符的優(yōu)先級(jí)父泳,否則會(huì)降低程序的可讀性般哼。因此注意以下兩點(diǎn)。
- 不要把一個(gè)表達(dá)式寫(xiě)得過(guò)于復(fù)雜惠窄,如果一個(gè)表達(dá)式過(guò)于復(fù)雜蒸眠,應(yīng)把它分成幾步來(lái)完成。
- 不要過(guò)多地依賴(lài)運(yùn)算符的優(yōu)先級(jí)來(lái)控制表達(dá)式的執(zhí)行順序杆融,這會(huì)降低程序的可讀性楞卡,應(yīng)盡量使用()來(lái)控制表達(dá)式的執(zhí)行順序。