iOS開(kāi)發(fā)基礎(chǔ)-C語(yǔ)言數(shù)據(jù)類(lèi)型和運(yùn)算符

第2章 數(shù)據(jù)類(lèi)型和運(yùn)算符

2.1 注釋

  1. 程序注釋是源代碼的一個(gè)重要部分户敬,對(duì)于一份規(guī)范的程序源代碼而言嫂易,注釋?xiě)?yīng)該占到源代碼的1/3以上计寇;
  2. 單行注釋 //仙蚜;
  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)為分隔符丹拯。

  1. 分號(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é)束即可。

  2. 花括號(hào)
    花括號(hào)的作用就是定義一個(gè)代碼塊七芭,一個(gè)代碼塊指的就是" {" 和" }" 所包含的一段代碼素挽,代碼塊在邏輯上是一個(gè)整體。

  3. 方括號(hào)

  4. 圓括號(hào)

  5. 空格
    Objective-C 語(yǔ)言中的空格包含空格符(Space)狸驳、制表符(Tab) 和回車(chē)(Enter) 等预明。除此之外,Objective-C 源程序還會(huì)使用空格來(lái)合理縮進(jìn)代碼耙箍,從而提供更好的可讀性撰糠。

  6. 圓點(diǎn)

2.2.2 標(biāo)識(shí)符規(guī)則

標(biāo)識(shí)符,就是用于給程序中變量辩昆、類(lèi)阅酪、方法命名的符號(hào)。規(guī)則如下:

  1. 標(biāo)識(shí)符可以由字母汁针、數(shù)字术辐、下畫(huà)線(_)和美元符($)組成,其中不能以數(shù)字開(kāi)頭施无;
  2. 標(biāo)識(shí)符不能是Objective-C 關(guān)鍵字辉词,但可以包含關(guān)鍵字;
  3. 標(biāo)識(shí)符不能包含空格猾骡;
  4. 標(biāo)識(shí)符只能包含美元符($)瑞躺,不能包含@隧魄、#等其他特殊字符;
  5. Objective-C語(yǔ)言是區(qū)分大小寫(xiě)的隘蝎。因此,abc 和Abe 是兩個(gè)不同的標(biāo)識(shí)符襟企;

2.2.3 Objective-C 關(guān)鍵字

  1. auto
  2. break
  3. case
  4. char
  5. const
  6. continue
  7. default
  8. do
  9. double
  10. else
  11. enum
  12. extern
  13. float
  14. for
  15. goto
  16. if
  17. int
  18. long
  19. register
  20. return
  21. short
  22. signed
  23. sizeof
  24. static
  25. struct
  26. switch
  27. typedef
  28. union
  29. unsigned
  30. void
  31. volatile
  32. 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)型:

  1. 基本類(lèi)型
    1. 整型
    2. 字符型
    3. 浮點(diǎn)型
      1. float類(lèi)型
      2. double類(lèi)型
    4. 枚舉型
  2. 構(gòu)造類(lèi)型
    1. 數(shù)組類(lèi)型
    2. 結(jié)構(gòu)體類(lèi)型
    3. 共用體類(lèi)型
  3. 指針類(lèi)型
    1. 指針類(lèi)型既是C 語(yǔ)言最重要的數(shù)據(jù)類(lèi)型曼振,也是Objective-C 最重要的類(lèi)型,所有的系統(tǒng)類(lèi)蔚龙、自定義類(lèi)的本質(zhì)都是指針類(lèi)型冰评。
    2. 還有一種特殊的空類(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 整型

  1. short int(簡(jiǎn)稱(chēng)short):在內(nèi)存中通常占16位,取值范圍:-2^15 ~ 2^15 - 1苍在;
  2. int:在內(nèi)存中通常占32位绝页,取值范圍:-2^31 ~ 2^31 - 1;
  3. long int(簡(jiǎn)稱(chēng)long):在內(nèi)存中通常占64位寂恬,取值范圍:-2^63 ~ 2^63 - 1续誉;
  4. 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)的變量填充。
%格式的占位符如下:

  1. %d:以帶符號(hào)的十進(jìn)制形式輸出整數(shù)(正數(shù)不輸出符號(hào))份殿;

  2. %o:以八進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不輸出0 前綴)膜钓;

  3. %x:以十六進(jìn)制無(wú)符號(hào)形式輸出整數(shù)(不輸出0x 前綴);

  4. %u:以無(wú)符號(hào)十進(jìn)制形式輸出整數(shù)卿嘲;

  5. %c:以字符形式輸出颂斜,只輸出一個(gè)字符;

  6. %s:輸出C 風(fēng)格的字符串拾枣;

  7. %f:以小數(shù)形式輸出浮點(diǎn)數(shù)沃疮,默認(rèn)輸出6 位小數(shù);

  8. %e:以指數(shù)形式輸出浮點(diǎn)數(shù)梅肤,數(shù)字部分默認(rèn)輸出6 位小數(shù)司蔬;

  9. %g:自動(dòng)選用%f 或%e 其中之一,保證輸出寬度較短的格式姨蝴,并且不會(huì)輸出無(wú)意義的0俊啼;

  10. %p:以十六進(jìn)制形式輸出指針變量所代表的地址值;

  11. %@:輸出Objective-C 的對(duì)象左医;

  12. %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;
    

在%與格式字符之間同木,還可插入如下附加符:

  1. l (字母):可在格式字符d、o跛十、x彤路、u 之前,用于輸出長(zhǎng)整型整數(shù)芥映,比如%ld洲尊;也可在f、e屏轰、g 之前,用于輸出長(zhǎng)浮點(diǎn)型數(shù)憋飞;
  2. m (代表一個(gè)正整數(shù)):指定輸出數(shù)據(jù)所占的最小寬度霎苗;
  3. .n:對(duì)于浮點(diǎn)數(shù),表示輸出n 位小數(shù)榛做;對(duì)于字符串唁盏,表示截取的字符個(gè)數(shù);
  4. -:表示輸出的數(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é)含潘。

  1. 直接通過(guò)單個(gè)字符來(lái)指定字符常量:例如'A'饲做、'9'和'O'等;
  2. 通過(guò)轉(zhuǎn)義字符表示特殊字符常量:例如'\n'遏弱、'\t'等艇炎;

轉(zhuǎn)義字符如下:

  1. \b:退格符;
  2. \n:換行符腾窝;
  3. \r:回車(chē)符enter缀踪;
  4. \t:制表符tab居砖;
  5. \":雙引號(hào);
  6. \'驴娃;單引號(hào)奏候;
  7. \\;反斜線唇敞;

不僅如此蔗草,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ù)有兩種表示形式

  1. 十進(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)型處理;
  2. 科學(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 枚舉型

  1. 枚舉類(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);
```

  1. 定義匿名枚舉類(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ō)明:

  1. 定義枚舉時(shí){}中列出來(lái)的枚舉值阴幌,也稱(chēng)為枚舉常量或枚舉元素勺阐,這些枚舉值不是變量,因此不能對(duì)它們賦值矛双。實(shí)際上渊抽,每個(gè)枚舉常量按它們的定義順序,依次為0议忽、l 懒闷、2、3,以此類(lèi)推徙瓶。當(dāng)然也可顯式指定枚舉常量的值毛雇;
  2. 枚舉常量的本質(zhì)就是無(wú)符號(hào)整數(shù)嫉称,因此侦镇,枚舉值可以用來(lái)比較大小。比較大小的規(guī)則就是它們實(shí)際的整數(shù)值织阅;
  3. 枚舉值的本質(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ī)則如下:

  1. 把整型類(lèi)型(包括字符型)的變量和值賦值給浮點(diǎn)型變量,不會(huì)有太大的變化骨田;

  2. 把浮點(diǎn)型類(lèi)型的變量和值賦值給整型(包括字符型)變量耿导,數(shù)值的小數(shù)部分會(huì)被直接舍棄;

  3. 當(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)提升:

  1. 所有的short 型、char 型將被提升到int 型谬以;
  2. 整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類(lèi)型自動(dòng)提升到與表達(dá)式中最高等級(jí)操作數(shù)同樣的類(lèi)型强饮;
  3. 操作數(shù)的等級(jí)排列為short<int<long<long long<float<double<long double;

2.6 運(yùn)算符

Objective-C 語(yǔ)言中的運(yùn)算符可分為如下幾種:

  1. 算術(shù)運(yùn)算符
  2. 賦值運(yùn)算符
  3. 比較運(yùn)算符
  4. 邏輯運(yùn)算符
  5. 位運(yùn)算符
  6. 類(lèi)型相關(guān)運(yùn)算符

2.6.1 算術(shù)運(yùn)算符

  1. +:加法運(yùn)算符为黎,+還可以作為字符串的連接運(yùn)算符邮丰;

  2. -:減法運(yùn)算符,還可以作為求負(fù)的運(yùn)算符號(hào)碍舍;

  3. *:乘法運(yùn)算符柠座;

  4. /:除法運(yùn)算法;
    除法運(yùn)算符有些特殊片橡,如果除法運(yùn)算符的兩個(gè)運(yùn)算數(shù)都是整數(shù)類(lèi)型妈经,則計(jì)算結(jié)果也是整數(shù),就是將自然除法的結(jié)果截?cái)嗳≌纾?9/4 的結(jié)果是4,而不是5吹泡。

  5. %:求余運(yùn)算符骤星;
    它要求運(yùn)算符兩邊的操作數(shù)都必須是整數(shù),它的計(jì)算結(jié)果是使用第一個(gè)運(yùn)算數(shù)來(lái)除以第二個(gè)運(yùn)算數(shù)(不可以為0)爆哑,得到一個(gè)整除的結(jié)果后洞难,剩下的值就是余數(shù)。

  6. ++:自加揭朝;
    這是一個(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
    
  7. --:自減嘉抓;
    也是一個(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)算符有如下:

  1. &:按位與枫匾;
  2. |:按位或架诞;
  3. ~:按位非;
  4. ^ :按位異或干茉;
  5. <<:左位移運(yùn)算符谴忧;
  6. >>:右位移運(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爬虱,再取反就是原碼。

例子:

  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)
    
    
  2. 異或運(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。

例子:

  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)算符。

  1. +=拉队; x += y弊知,對(duì)應(yīng)x = x + y;
  2. -=粱快;
  3. *=秩彤;
  4. /=夺鲜;
  5. %=
  6. |=呐舔;
  7. &=币励;
  8. ^=
  9. <<=珊拼;
  10. >>=食呻;x>>=y,對(duì)應(yīng)x = x>>y澎现;

2.6.5 比較運(yùn)算符

比較運(yùn)算符用于判斷兩個(gè)變量或常量的大小仅胞,比較運(yùn)算的結(jié)果是整數(shù)值(1 代表真、0 代表假)

  1. >剑辫;
  2. >=干旧;
  3. <;
  4. <=妹蔽;
  5. ==椎眯;
    如果進(jìn)行比較的兩個(gè)操作數(shù)都是數(shù)值型,即使它們的數(shù)據(jù)類(lèi)型不相同胳岂,只要它們的值相等编整,都將返回1。例如乳丰,97=='a'返回1掌测; 5.0 = 5也返回1。
  6. !=产园;
    如果進(jìn)行比較的兩個(gè)操作數(shù)都是數(shù)值型汞斧,無(wú)論它們的數(shù)據(jù)類(lèi)型是否相同,只要它們的值不相等什燕,都將返回1粘勒。

2.6.6 邏輯運(yùn)算符

邏輯運(yùn)算符用于操作兩個(gè)布爾型的變量或常量。

  1. &&(與)秋冰;必須前后兩個(gè)操作數(shù)都是真才返回真仲义,否則返回假婶熬。

  2. ||(或)剑勾;只要兩個(gè)操作數(shù)中有一個(gè)真,就可以返回真赵颅,否則返回假虽另。

  3. !(非);

    只需要一個(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拴还。

  4. ^(異或)跨晴;當(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í):

  1. 分隔符:. () [] {} ->
  2. 單目運(yùn)算符:++ -- ~ ! *(取變量運(yùn)算符) &(取地址運(yùn)算符) sizeof车酣;
  3. 強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符:(type)曲稼;
  4. 乘法/除法/求余:* / %索绪;
  5. 加法/減法:+ -
  6. 移位運(yùn)算符:<< >>贫悄;
  7. 關(guān)系運(yùn)算符:< <= > >=瑞驱;
  8. 等價(jià)運(yùn)算符:== !=
  9. 按位與:&窄坦;
  10. 按位異或:^钱烟;
  11. 按位或:|
  12. 條件與:&&嫡丙;
  13. 條件或:||拴袭;
  14. 三目運(yùn)算符:?:
  15. 賦值:= += -= *= /= &= |= ^= %= <<= >>=曙博;
  16. 逗號(hào)運(yùn)算符:,拥刻;

雖然Objective-C 運(yùn)算符存在這種優(yōu)先級(jí)的關(guān)系,但并不推薦過(guò)度依賴(lài)這種運(yùn)算符的優(yōu)先級(jí)父泳,否則會(huì)降低程序的可讀性般哼。因此注意以下兩點(diǎn)。

  1. 不要把一個(gè)表達(dá)式寫(xiě)得過(guò)于復(fù)雜惠窄,如果一個(gè)表達(dá)式過(guò)于復(fù)雜蒸眠,應(yīng)把它分成幾步來(lái)完成。
  2. 不要過(guò)多地依賴(lài)運(yùn)算符的優(yōu)先級(jí)來(lái)控制表達(dá)式的執(zhí)行順序杆融,這會(huì)降低程序的可讀性楞卡,應(yīng)盡量使用()來(lái)控制表達(dá)式的執(zhí)行順序。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脾歇,一起剝皮案震驚了整個(gè)濱河市蒋腮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藕各,老刑警劉巖池摧,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異激况,居然都是意外死亡作彤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)乌逐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)竭讳,“玉大人,你說(shuō)我怎么就攤上這事黔帕〈蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵成黄,是天一觀的道長(zhǎng)呐芥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奋岁,這世上最難降的妖魔是什么思瘟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮闻伶,結(jié)果婚禮上滨攻,老公的妹妹穿的比我還像新娘。我一直安慰自己蓝翰,他們只是感情好光绕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著畜份,像睡著了一般诞帐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆雹,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天停蕉,我揣著相機(jī)與錄音,去河邊找鬼钙态。 笑死慧起,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的册倒。 我是一名探鬼主播蚓挤,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼驻子!你這毒婦竟也來(lái)了屈尼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拴孤,失蹤者是張志新(化名)和其女友劉穎脾歧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體演熟,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞭执,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芒粹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兄纺。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖化漆,靈堂內(nèi)的尸體忽然破棺而出估脆,到底是詐尸還是另有隱情,我是刑警寧澤座云,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布疙赠,位于F島的核電站付材,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏圃阳。R本人自食惡果不足惜佳励,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一赂乐、第九天 我趴在偏房一處隱蔽的房頂上張望黄痪。 院中可真熱鬧沉衣,春花似錦、人聲如沸锣夹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)银萍。三九已至变勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砖顷,已是汗流浹背贰锁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滤蝠,地道東北人豌熄。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像物咳,于是被迫代替她去往敵國(guó)和親锣险。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容