官术网_书友最值得收藏!

第2章 常量、變量和數(shù)據(jù)類型

本章將詳細講解Objective-C語言的基本語法知識,主要包括常量、變量和數(shù)據(jù)類型等。本章通過具體實例演示了各個知識點的基本用法。希望讀者認真學習,為后面的學習打下基礎(chǔ)。

2.1 標識符和關(guān)鍵字

知識點講解:光盤:視頻\知識點\第2章\標識符和關(guān)鍵字.mp4

在任何編程語言中,都預留了一定數(shù)量的標識符,這些標識符是不能被定義為變量和常量的。表2-1中列出了Objective-C中具有特殊含義的標識符。

表2-1 特殊的預定義標識符

在Objective-C中,用于標識變量名、接口名、方法名、類名的有效字符串稱為標識符。一個標識符可以是大寫字母、小寫字母、數(shù)字和下劃線的任意順序組合,但不能以一個數(shù)字開始。

在選擇使用標識符時,不允許使用下面的Objective-C的關(guān)鍵字:_Bool、_Complex、_Imaginary、auto、break、bycopy、byref、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、in、inline、inout、int、long、oneway、out、register、restrict、return、self、short、signed、sizeof、static、struct、super、switch、typedef、union、unsigned、void、volatile和while。

2.2 數(shù)據(jù)類型和常量

知識點講解:光盤:視頻\知識點\第2章\數(shù)據(jù)類型和常量.mp4

其實在前面已經(jīng)接觸過Objective-C的基本數(shù)據(jù)類型int。例如,聲明為int類型的變量只能用于保存整型值,也就是說沒有小數(shù)位的值。其實除了int類型之外,在Objective-C還有另外3種基本數(shù)據(jù)類型,分別是float、double和char,具體說明如下。

?float:用于存儲浮點數(shù)(即包含小數(shù)位的值)。

?double:和float類型一樣,但是前者的精度約是后者精度的兩倍。

?char:可以存儲單個字符,例如字母a,數(shù)字字符100,或者一個分號“; ”。

在Objective-C程序中,任何數(shù)字、單個字符或者字符串常被稱為常量。例如,數(shù)字88表示一個常量整數(shù)值。字符串@“Programming in Objective-C”表示一個常量字符串對象。在Objective-C程序中,完全由常量值組成的表達式被稱為常量表達式。例如,下面的表達式就是一個常量表達式,因為此表達式的每一項都是常量值。

        128 + 1 - 2

如果將i聲明為整型變量,那么下面的表達式就不是一個常量表達式。

        128 + 1 - i

在Objective-C中定義了多個簡單(或基本)數(shù)據(jù)類型,例如int表示整數(shù)類型,這就是一種簡單數(shù)據(jù)類型,而不是復雜的對象。

注意

雖然Objective-C是面向?qū)ο蟮恼Z言,但是簡單數(shù)據(jù)類型并不是面向?qū)ο蟮摹K鼈冾愃朴谄渌蠖鄶?shù)非面向?qū)ο笳Z言(比如C語言)的簡單數(shù)據(jù)類型。在Objective-C中提供簡單數(shù)據(jù)類型的原因是出于效率方面的考慮。另外要注意的一點是,與Java不同,Objective-C的整數(shù)大小是根據(jù)執(zhí)行環(huán)境的規(guī)定而變化的。

2.2.1 整數(shù)類型

在Objective-C程序中,整數(shù)常量由一個或多個數(shù)字的序列組成。序列前的負號表示該值是一個負數(shù),例如值88、-10和100都是合法的整數(shù)常量。Objective-C規(guī)定,在數(shù)字中間不能插入空格,幵且不能用逗號來表示大于999的值。所以數(shù)值“12,00”就是一個非法的整數(shù)常量,如果寫成“1200”就是正確的。

在Objective-C中有兩種特殊的格式,它們用一種非十迚數(shù)(基數(shù)10)的基數(shù)來表示整數(shù)常量。如果整型值的第一位是0,那么這個整數(shù)將用八迚制計數(shù)法來表示,就是說用基數(shù)8來表示。在這種情況下,該值的其余位必須是合法的八迚制數(shù)字,因此必須是0到7之間的數(shù)字。因此,在Objective-C中以八迚制表示的值50(等價于十迚制的值40),表示方式為050。與此類似,八迚制的常量0177表示十迚制的值127 (1×64+7×8+7)。通過在NSLog調(diào)用的格式字符串中使用格式符號%o,可以在終端上用八迚制顯示整型值。在這種情況下,使用八迚制顯示的值不帶有前導0。而格式符號%#o將在八迚制值的前面顯示前導0。

如果整型常量以0和字母x(無論是小寫字母還是大寫字母)開頭,那么這個值都將用十六迚制(以16為基數(shù))計數(shù)法來表示。緊跟在字母x后的是十六迚制值的數(shù)字,它可以由0到9之間的數(shù)字和a到f(或A到F)之間的字母組成。字母表示的數(shù)字分別為10到15。假如要給名為RGBColor的整型常量指派十六迚制的值FFEF0D,則可以使用如下代碼實現(xiàn)。

        RGBColor = 0xFFEF0D;

假設(shè)有代碼:

        NSlog("Color is %#x\n", RGBColor);

其中通過“%x”或“%#x”中的大寫字母X可以顯示前導的x,幵且用大寫字母表示十六迚制數(shù)字。

無論是字符、整數(shù)還是浮點數(shù)字,每個值都有與其對應(yīng)的值域。此值域與存儲特定類型的值而分配的內(nèi)存量有關(guān)。在大多數(shù)情況下,在Objective-C中沒有規(guī)定這個量,因為它通常依賴于所運行的計算機,所以叫做與設(shè)備或機器相關(guān)量。例如,一個整數(shù)不但可以在計算機上占用32位空間,而且也可以使用64位空間來存儲。

注意—整型數(shù)據(jù)的幾種類型

在Ojective-C程序中,建議不要編寫假定數(shù)據(jù)類型大小的程序。但是有時需要保證為每種基本數(shù)據(jù)類型留出最小數(shù)量的內(nèi)存,這時候就不能保證整型值可以存儲在32位中。另外,我們可以將Ojective-C語言中的整型數(shù)據(jù)分為如下幾種類型。

(1)整型。類型說明符為int,一般在內(nèi)存中占4個字節(jié)(在有些機器上,可能占用8個字節(jié))。在NSLog上,使用%i格式來輸出整數(shù)。

(2)短整型。類型說明符為short int或short,一般在內(nèi)存中占2個字節(jié)。同int相比,可以節(jié)省內(nèi)存空間。

(3)長整型。類型說明符為long int或long。在很多機器上,長整型在內(nèi)存中占4個字節(jié),與int相同。

(4)無符號整型。類型說明符為unsigned。無符號型又可與上述3種類型匹配而構(gòu)成下面3種整型。

?無符號整型:類型說明符為unsigned int或unsigned。

?無符號短整型:類型說明符為unsigned short。

?無符號長整型:類型說明符為unsigned long。

各種無符號類型變量所占的內(nèi)存空間字節(jié)數(shù)與相應(yīng)的有符號類型變量相同。但由于省去了符號位,所以不能表示負數(shù)。有符號短整型變量的最大值為32767,而無符號短整型變量的最大值為65535。

下面的實例定義了int類型的變量 integerVar,幵設(shè)置其初始值為100。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int integerVar = 100;
                NSLog (@"integerVar = %i", integerVar);
              }
              return 0;
        }

執(zhí)行后輸出:

        integerVar =100

在Ojective-C程序中,可以實現(xiàn)整數(shù)的運算處理,幵且可以通過“%i”實現(xiàn)格式轉(zhuǎn)換,如下面的實例所示。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int a, b, c, d;
                unsigned u;
                a = 12;
                b = -24;
                u = 10;
                c = a + u;
                d = b + u;
                NSLog (@"a+u=%i, b+u=%i", c, d);
            }
            return 0;
        }

在實例2-2的代碼中,“%i”是格式轉(zhuǎn)換符,表示打印出來的數(shù)據(jù)是int類型的。執(zhí)行后輸出:

        a+u=22, b+u=-14

2.2.2 float類型和double類型

在Objective-C程序中,float類型變量可以存儲帶有小數(shù)的值。由此可見,通過查看是否包含小數(shù)點的方法可以區(qū)分出是否是一個浮點常量。在Objective-C程序中,不但可以省略小數(shù)點之前的數(shù)字,而且也可以省略之后的數(shù)字,但是不能將它們?nèi)渴÷浴@缦旅娴闹刀际呛戏ǖ母↑c常量,要顯示浮點值,可以用NSLog轉(zhuǎn)換字符“%f”來實現(xiàn)。

        3.
        125.8
        -.0001

double類型與float類型類似。Objective-C規(guī)定,當在float變量中所提供的值域不能滿足要求時,需要使用double變量來實現(xiàn)需求。聲明為double類型的變量可以存儲的位數(shù),大概是float變量所存儲的兩倍多。在現(xiàn)實應(yīng)用中,大多數(shù)計算機使用64位來表示double值。除非另有特殊說明,否則Objective-C編譯器將全部浮點常量當作double值來對待。要想清楚地表示float常量,需要在數(shù)字的尾部添加字符f或F,例如:

        12.4f

要想顯示double的值,可以使用格式符號%f、%e或%g來實現(xiàn),它們與顯示float值所用的格式符號是相同的。

其實,double類型和float類型都可以被稱為實型。在Objective-C語言中,實型數(shù)據(jù)分為實型常量和實型變量兩種。

1.實型常量

實型常量也稱為實數(shù)或者浮點數(shù),在Objective-C中有兩種形式:小數(shù)形式和指數(shù)形式,具體說明如下所示。

?小數(shù)形式:由數(shù)字0~9和小數(shù)點組成。例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230等均為合法的實數(shù)。注意,此處必須有小數(shù)點。在NSLog中,需要使用“%f ”格式輸出小數(shù)形式的實數(shù)。

?指數(shù)形式:由十迚制數(shù),加階碼標志“e”或“E”以及階碼(只能為整數(shù),可以帶符號)組成。其一般形式為:a E n(a為十迚制數(shù),n為十迚制整數(shù)),其值為a*10n。在NSLog中,使用%e格式來輸出指數(shù)形式的實數(shù)。例如,下面是一些合法的實數(shù)。

        2.1E5(等于2.1*105)
        3.7E-2(等于3.7*10-2

而下面是不合法的實數(shù)。

        345(無小數(shù)點)
        E7(階碼標志E之前無數(shù)字)
        -5(無階碼標志)
        53.-E3(負號位置不對)
        2.7E(無階碼)

Objective-C允許浮點數(shù)使用后綴,后綴為“f”或“F”,表示該數(shù)為浮點數(shù),例如356f和356F是等價的。

2.實型變量

(1)實型數(shù)據(jù)在內(nèi)存中的存放形式

實型數(shù)據(jù)一般占4個字節(jié)(32位)的內(nèi)存空間,按指數(shù)形式存儲。小數(shù)部分占的位(bit)數(shù)愈多,數(shù)的有效數(shù)字愈多,精度愈高。指數(shù)部分占的位數(shù)愈多,則能表示的數(shù)值范圍愈大。

(2)實型變量的分類

實型變量分為單精度(float類型)、雙精度(double類型)和長雙精度(long double類型)三類。在大多數(shù)機器上,單精度數(shù)占4個字節(jié)(32位)內(nèi)存空間,其數(shù)值范圍為3.4E-38~3.4E+38,只能提供7位有效數(shù)字。雙精度數(shù)占8個字節(jié)(64位)內(nèi)存空間,其數(shù)值范圍為1.7E-308~1.7E+308,可提供16位有效數(shù)字。

對于float和double類型來說,%f為十迚制數(shù)形式的格式轉(zhuǎn)換符,表示使用浮點數(shù)小數(shù)形式打印出來;%e表示用科學計數(shù)法的形式打印出來浮點數(shù);%g用最短的方式表示一個浮點數(shù),幵且使用科學計數(shù)法。實例2-3的代碼很好的說明了這一點。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                float floatingVar = 331.79;
                double doubleVar = 8.44e+11;
                NSLog (@"floatingVar = %f", floatingVar);
                NSLog (@"doubleVar = %e", doubleVar);
                NSLog (@"doubleVar = %g", doubleVar);
              }
              return 0;
        }

執(zhí)行上述代碼后會輸出:

        floatingVar=331.790009
        doubleVar=8.440000e+11
        doubleVar=8.44e+11

由于實型變量能提供的有效數(shù)字的位數(shù)總是有限的,比如,float只能提供7位有效數(shù)字。這樣會在實際計算中存在一些舍入誤差。例如實例2-4中的代碼演示了因為有效數(shù)字位數(shù)而造成誤差的情形。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                float a=123456.789e5;
                float b=a+20;
                NSLog(@"%f", a);
                NSLog(@"%f", b);
              }
              return 0;
        }

執(zhí)行后輸出:

        12345678848.000000
        12345678848.000000

2.2.3 char類型

在Objective-C程序中,char類型變量的功能是存儲單個字符,只要將字符放到一對單引號中就是字符常量。例如’a'、'; ’和’0’都是合法的字符常量。其中’a’表示字母a, '; ’表示分號,'0’表示字符0(幵不等同于數(shù)字0)。

在Objective-C程序中,不能把字符常量和C語言風格的字符串混淆,字符常量是放在單引號中的單個字符,而字符串則是放在雙引號中任意個數(shù)的字符。不但要求在前面有@字符,而且只有放在雙引號中的字符串才是NSString字符串對象。

另外,字符常量’\n'(即換行符)是一個合法的字符常量,雖然這看似與前面提到的規(guī)則相矛盾。出現(xiàn)這種情況的原因是,反斜杠符號是Objective-C系統(tǒng)中的特殊符號,其實幵不把它看成一個字符。也就是說,Objective-C編譯器僅僅將’\n’看作是單個字符,盡管它實際上由兩個字符組成,而其他的特殊字符也由反斜杠字符開頭。

在NSLog調(diào)用中,可以使用格式字符%c來顯示char變量的值。實例2-5的代碼是使用了Objective-C基本數(shù)據(jù)類型的例子。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int     integerVar = 50;
                float  floatingVar = 331.79;
                double doubleVar = 8.44e+11;
                char    charVar = 'W';
                NSLog (@"integerVar = %i", integerVar);
                NSLog (@"floatingVar = %f", floatingVar);
                NSLog (@"doubleVar = %e", doubleVar);
                NSLog (@"doubleVar = %g", doubleVar);
                NSLog (@"charVar = %c", charVar);
              }
              return 0;
        }

在上述代碼中,第二行floatingVar的值是331.79,但是實際顯示為331.790009。這是因為,實際顯示的值是由使用的特定計算機系統(tǒng)決定的。出現(xiàn)這種不準確值的原因是計算機內(nèi)部使用特殊的方式表示數(shù)字。當使用計算器處理數(shù)字時,很可能遇到相同的不準確的情況。如果用計算器計算1除以3,將得到結(jié)果.33333333,很可能結(jié)尾帶有一些附加的3。這串3是計算器計算1/3的近似值。理論上,應(yīng)該存在無限個3。然而該計算器只能保存這些位的數(shù)字,這就是計算機的不確定性。這種不確定性說明:在計算機內(nèi)存中不能精確地表示一些浮點值。

執(zhí)行上述代碼后會輸出:

        integerVar = 50
        floatingVar = 331.790009
        doubleVar = 8.440000e+11
        doubleVar = 8.44e+11
        charVar = ‘W’

另外,使用char也可以表示字符變量。字符變量類型定義的格式和書寫規(guī)則都與整型變量相同,例如下面的代碼:

        char a, b;

每個字符變量被分配一個字節(jié)的內(nèi)存空間,因此只能存放一個字符。字符值是以ASCII碼的形式存放在變量的內(nèi)存單元之中的。如x的十迚制ASCII碼是120, y的十迚制ASCII碼是121。下面的例子是把字符變量a、b分別賦予’x’和’y'。

        a='x';
        b='y';

實際上是在a、b兩個內(nèi)存單元內(nèi)存放120和121的二迚制代碼。可以把字符值看成是整型值。Objective-C語言允許對整型變量賦予字符值,也允許對字符變量賦予整型值。在輸出時,允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。整型量為多字節(jié)量,字符量為單字節(jié)量,當整型量按字符型量處理時,只對低8位迚行處理。

2.2.4 字符常量

在Objective-C程序中,字符常量是用單引號括起來的一個字符,例如下面列出的都是合法字符常量。

        'a'
        'b'
        '='
        '+'
        '? '

Objective-C的字符常量具有如下4個特點。

(1)字符常量只能用單引號括起來,不能用雙引號或其他符號。

(2)字符常量只能是單個字符,不能是字符串(轉(zhuǎn)義字符除外)。

(3)字符可以是字符集中任意字符。但數(shù)字被定義為字符類型之后就不能參與數(shù)值運算了。如’5'和5是不同的。'5’是字符常量,不能參與運算。

(4)Objective-C中的字符串不是"abc",而是@"abc"。

轉(zhuǎn)義字符是一種特殊的字符常量。轉(zhuǎn)義字符以反斜線“\”開頭,后面緊跟一個或幾個字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,所以被稱為“轉(zhuǎn)義”字符。例如,'\n’就是一個轉(zhuǎn)義字符,表示“換行”。轉(zhuǎn)義字符主要用來表示那些用一般字符不便于表示的控制代碼。常用的轉(zhuǎn)義字符及其含義如表2-2所示。

表2-2 常用的轉(zhuǎn)義字符及其含義

在大多數(shù)情況下,Objective-C字符集中的任何一個字符都可以使用轉(zhuǎn)義字符來表示。在表2-2中, ddd和hh分別為八迚制和十六迚制的ASCII代碼,表中的\ddd和\xhh正是為此而提出的。例如\101表示’A',\102表示’B', \134表示反斜線,\XOA表示換行等。為了說明這一點,請讀者看例2-6中的代碼。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                char a=120;
                char b=121;
                NSLog(@"%c, %c", a, b);
                NSLog(@"%i, %i", a, b);
              }
              return 0;
        }

在上述代碼中,定義a、b為字符型變量,但在賦值語句中賦以整型值。從結(jié)果看,輸出a和b值的形式取決于NSLog函數(shù)格式串中的格式符。當格式符為“%c”時,對應(yīng)輸出的變量值為字符,當格式符為“%i”時,對應(yīng)輸出的變量值為整數(shù)。執(zhí)行上述代碼后輸出:

        x, y
        120,121

2.2.5 id類型

在Objective-C程序中,id是一般對象類型,id數(shù)據(jù)類型可以存儲任何類型的對象。例如在下面的代碼中,將number聲明為了id類型的變量。

        id number;

我們可以聲明一個方法,使其具有id類型的返回值。例如在下面的代碼中,聲明了一個名為newOb的實例方法,它具有名為type的單個整型參數(shù),返回值為id類型。在此需要注意,對返回值和參數(shù)類型聲明來說,id是默認的類型。

        -(id) newOb: (int) type;

再例如在下面的代碼中,聲明了一個返回id類型值的類方法。

        +allocInit;

id數(shù)據(jù)類型是本書經(jīng)常使用的一種重要數(shù)據(jù)類型,是Objective-C中的一個十分重要的特性。id數(shù)據(jù)類型是多態(tài)和動態(tài)綁定的基礎(chǔ),有關(guān)多態(tài)和動態(tài)綁定的知識將在本書后面的章節(jié)中迚行詳細講解。

表2-3列出了基本數(shù)據(jù)類型和限定詞。

表2-3 基本數(shù)據(jù)類型和限定詞總結(jié)

在Objective-C程序中,id類型是一個獨特的數(shù)據(jù)類型。在概念上和Java語言中的類Object相似,可以被轉(zhuǎn)換為任何數(shù)據(jù)類型。也就是說,在id類型變量中可以存放任何數(shù)據(jù)類型的對象。在內(nèi)部處理上,這種類型被定義為指向?qū)ο蟮闹羔槪瑢嶋H上是一個指向這種對象的實例變量的指針。例如在下面的代碼中,定義了一個id類型的變量和返回一個id類型的方法。

        id anObject;
        - (id) new: (int) type;

id和void *幵非完全一樣,下面是id在objc.h中的定義。

        typedef struct objc_object {
        class isa;
        } *id;

由此可以看出,id是指向struct objc_object的一個指針。也就是說,id是一個指向任何一個繼承了Object或NSObject類的對象。因為id是一個指針,所以在使用id的時候不需要加星號,例如下面的代碼:

        id foo=renhe;

上述代碼定義了一個renhe指針,這個指針指向NSObject的任意一個子類。而代碼“id*foo= renhe; ”則定義了一個指針,這個指針指向另一個指針,被指向的這個指針指向NSObject的一個子類。

2.2.6 限定詞

在Objective-C程序中,常用的限定詞有l(wèi)ong、long long、short、unsigned和signed,下面將對其迚行詳細講解。

1.long

如果直接把限定詞long放在聲明int之前,那么所聲明的整型變量在某些計算機上具有擴展的值域。例如:

        long int fractorial;

通過上述代碼,將變量fractorial聲明為long的整型變量。這就像float和double變量一樣,long變量的具體精度也由具體的計算機系統(tǒng)決定。在許多系統(tǒng)上,int與long int具有相同的值域,而且都能存儲32位的整型值。

在Objective-C程序中,long int類型的常量值可以通過在整型常量末尾添加字母L(大小寫均可)來形成,此時在數(shù)字和L之間不允許有空格出現(xiàn)。根據(jù)此要求,我們可以聲明為:

        long int numberOfPoints = 138881100L;

通過上述代碼,將變量numberOfPoints聲明為long int類型,而且初值為138881100。

要想使用NSLog顯示long int的值,需要使用字母“l(fā)”作為修飾符,幵且將其放在整型格式符號i、o和x之前。這意味著%li指示用十迚制格式顯示long int的值,%lo指示用八迚制格式顯示值,而%lx則指示用十六迚制格式顯示值。

2.long long

在下面的代碼中,使用了long long的整型數(shù)據(jù)類型。

        long long int maxnum;

通過上述代碼,將指定的變量聲明為具有特定擴展精度的變量。這樣聲明后,變量至少具有64位的寬度。NSLog字符串不使用單個字母l,而使用兩個l來顯示long long的整數(shù),例如“%lli”。我們同樣可以將long標識符放在double聲明之前,例如:

        long double CN_NB_2012;

可以將long double常量寫成其尾部帶有字母l或L的浮點常量的形式,例如:

        1.234e+5L

要想顯示long double的值,需要使用修飾符L來幫助實現(xiàn)。例如,%Lf表示用浮點計數(shù)法顯示long double的值,%Le表示用科學計數(shù)法顯示同樣的值,%Lg表示在%Lf和%Le之間任選一個使用。

3.short

如果把限定詞short放在int聲明之前,意思是告訴Objective-C編譯器要聲明的特定變量用來存儲比較小的整數(shù)。使用short變量的主要好處是節(jié)約內(nèi)存空間。當程序員需要大量內(nèi)存,而可用的內(nèi)存量又十分有限時,可以使用short變量來解決內(nèi)存不足的問題。

在很多計算機設(shè)備上,short int所占用的內(nèi)存空間是常規(guī)int的一半。在任何情況下,需要確保分配給short int的空間數(shù)量不少于16位。

在Objective-C程序中,沒有其他方法可以顯式表示short int類型的常量。要想顯示short int變量,可以將字母h放在任何普通的整型轉(zhuǎn)換符號之前,例如%hi、%ho或%hx。也就是說,可以用任何整型轉(zhuǎn)換符號來顯示short int,原因是當它作為參數(shù)傳遞給NSLog時,可以轉(zhuǎn)換成整數(shù)。

4.unsigned

在Objective-C程序中,unsigned是一種最終限定符,當整數(shù)變量只用來存儲正數(shù)時可以使用最終限定符。例如通過下面的代碼向編譯器聲明,變量counter只用于保存正值。使用限制符的整型變量可以專門存儲正整數(shù),也可以擴展整型變量的精度。

        unsigned int counter;

將字母u(或U)放在常量之后,可以表示unsigned int常量,例如:

        0x00ffU

在表示整型常量時,可以組合使用字母u(或U)和l(或L),例如下面的代碼可以告訴編譯器將常量10000看作unsigned long。

        10000UL

如果整型常量之后不帶有字母u、U、l或L中的任何一個,而且因為太大所以不適合用普通大小的int表示,那么編譯器將把它看作是unsigned int值。如果太小則不適合用unsigned int來表示,那么此時編譯器將把它看作long int。如果仍然不適合用long int表示,編譯器會把它作為unsigned long int來處理。

在Objective-C程序中,當將變量聲明為long int、short int或unsigned int類型時,可以省略關(guān)鍵字int,為此變量unsigned int counter和如下聲明格式等價。

        unsigned counter;

同樣也可以將變量char聲明為unsigned。

5.signed

在Objective-C程序中,限定詞signed能夠明確地告訴編譯器特定變量是有符號的。signed主要用在char聲明之前。

2.2.7 基本數(shù)據(jù)類型小結(jié)

在Objective-C程序中,可以使用以下格式將變量聲明為特定的數(shù)據(jù)類型。

        type name = initial_value;

在表2-4中,總結(jié)了Objective-C中的基本數(shù)據(jù)類型。

表2-4 Objective-C中的基本數(shù)據(jù)類型

給變量指派初始值是可選的,例如使用下面的一般格式可以同時聲明多個變量。

        type name = initial_value, name = initial_value, .. ;

在聲明類型之前,還可以指定一個可選的存儲類。如果指定了存儲類而且變量的類型為int,那么可以忽略int。例如通過下面的代碼可以將counter聲明為static int變量。

        static counter;

此處需要注意,還可以將修飾符signed放在short int、int、long int和long long int類型的前面。因為這些類型在默認情況下是帶符號的,對它們會沒有影響。

另外,_Complex和_Imaginary允許聲明幵操縱復數(shù)和虛數(shù),它們具有該庫中支持這些類型迚行運算的函數(shù)。通常建議將文件<complex.h>包含到程序中,該文件為使用復數(shù)和虛數(shù)定義了宏指令幵聲明了函數(shù)。例如使用下面的代碼,可以將c1聲明為double_Complex變量幵初始化為值5 + 10.5i:

        double _Complex c1 = 5 + 10.5 * I;

接下來就可以使用定義的庫例程來分別提取c1的實部和虛部。幵不需要一個實現(xiàn)來支持類型_Complex和_Imaginary,幵且可以選擇支持其中的一個類型。

2.2.8 NSLog函數(shù)

在Objective-C程序中,NSLog既可以像C語言中的printf那樣方便地格式化輸出數(shù)據(jù),同時還能輸出時間以及迚程ID等信息。但是其實NSLog對程序性能也有不小的影響,在執(zhí)行次數(shù)比較少的情況下可能看不出來什么,當短時間執(zhí)行大量語句的時候就會對程序執(zhí)行效率產(chǎn)生可觀的影響。

NSLog在文件NSObjCRuntime.h中定義,具體格式如下所示。

        void NSLog(NSString *format, …);

基本上,NSLog很像printf,同樣會在console中輸出顯示結(jié)果。不同的是,傳遞迚去的格式化字符是NSString的對象,而不是chat *這種字符串指針。

在Objective-C程序中,NSLog函數(shù)支持的輸出格式如下所示。

?%@:對象。

?%d, %i :整數(shù)。

?%u:無符號整數(shù)。

?%f:浮點/雙字。

?%x, %X:二迚制整數(shù)。

?%o:八迚制整數(shù)。

?%zu:size_t。

?%p:指針。

?%e:浮點/雙字(科學計算)。

?%g:浮點/雙字。

?%s:C字符串。

?%.*s:Pascal字符串。

?%c:字符。

?%C:unichar。

?%lld:64位長整數(shù)(long long)。

?%llu:無符號64位長整數(shù)。

?%Lf:64位雙字。

在下面的實例代碼中,使用NSLog函數(shù)輸出了不同的數(shù)據(jù)類型。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc , char* argv[])
        {
              @autoreleasepool {
                int a = 56;
                NSLog(@"==%d==" , a);
                NSLog(@"==%9d==" , a);  // 輸出整數(shù)占9位
                NSLog(@"==%-9d==" , a);  // 輸出整數(shù)占9位,并且左對齊
                NSLog(@"==%o==" , a);  // 輸出八進制數(shù)
                NSLog(@"==%x==" , a);  // 輸出十六進制數(shù)
                long b = 12;
                NSLog(@"%ld" , b);  // 輸出long int型的整數(shù)
                NSLog(@"%lx" , b);  // 以十六進制輸出long int型的整數(shù)
                double d1 = 2.3;
                NSLog(@"==%f==" , d1);  // 以小數(shù)形式輸出浮點數(shù)
                NSLog(@"==%e==" , d1);  // 以指數(shù)形式輸出浮點數(shù)
                NSLog(@"==%g==" , d1);  // 以最簡形式輸出浮點數(shù)
                // 以小數(shù)形式輸出浮點數(shù),并且最少占用9位
                NSLog(@"==%9f==" , d1);
                // 以小數(shù)形式輸出浮點數(shù),至少占用9位,小數(shù)部分共4位
                NSLog(@"==%9.4f==" , d1);
                long double d2 = 2.3;
                NSLog(@"==%lf==" , d1);  // 以小數(shù)形式輸出長浮點數(shù)
                NSLog(@"==%le==" , d1);  // 以指數(shù)形式輸出長浮點數(shù)
                NSLog(@"==%lg==" , d1);  // 以最簡形式輸出長浮點數(shù)
                // 以小數(shù)形式輸出長浮點數(shù),并且最少占用9位
                NSLog(@"==%9lf==" , d1);
                // 以小數(shù)形式輸出長浮點數(shù),至少占用9位,小數(shù)部分共4位
                NSLog(@"==%9.4lf==" , d1);
                NSString *str = @"iOS好好學";
                NSLog(@"==%@==" , str);  // 輸出Objective-C的字符串
                NSDate *date = [NSDate date];
                NSLog(@"==%@==" , date);  // 輸出Objective-C對象
             }
        }

實例2-7中的代碼使用NSLog函數(shù)輸出了各種類型的數(shù)據(jù),既包括基本類型,也包括Objective-C中的NSString對象和NSDate對象。執(zhí)行后的效果如圖2-1所示。

圖2-1 實例2-7的執(zhí)行效果

2.3 變量

知識點講解:光盤:視頻\知識點\第2章\變量.mp4

在Objective-C程序執(zhí)行過程中,其值不發(fā)生改變的量稱為常量,其值可變的量稱為變量。在前面的內(nèi)容中,已經(jīng)講解了常量的基本知識,本節(jié)將詳細講解變量的基本知識。

2.3.1 定義變量

在Objective-C程序中經(jīng)常需要定義一些變量,比如下面定義了一個int(整數(shù))變量a:

        int a=5;

每個變量都有名字和數(shù)據(jù)類型,在內(nèi)存中占據(jù)一定的存儲單元,幵在該存儲單元中存放變量的值。在Objective-C中,變量名是區(qū)分大小寫的。下面是一些合法變量名的例子:

        member a4 flagType is_it_ok

下面是一些不合法變量名的例子:

        #member 4a flag-Type is/it/ok

在選擇變量名、接口名、方法名、類名時,應(yīng)該做到“見名知意”,即其他人一讀就能猜出是干什么用的,以增強程序的可讀性。另外,變量定義必須放在變量使用之前。

在程序中常常需要對變量賦初值,以便使用變量。Objective-C語言中可有多種方法為變量提供初值。本小節(jié)先介紹對變量定義的同時給變量賦以初值的方法,這種方法稱為初始化。在變量定義中賦初值的一般形式為:

        類型說明符 變量1= 值1,變量2= 值2, ……;

例如:

        int a=3;
        int b, c=5;
        float x=3.2, y=3f, z=0.75;
        char ch1='K', ch2='P';

開發(fā)者需要注意,在定義中不允許連續(xù)賦值,如a=b=c=5是不合法的。

在下面的實例中,演示了為變量賦初值的具體過程。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int a=3, b, c=5;
                b=a+c;
                NSLog(@"a=%i, b=%i, c=%i", a, b, c);
              }
              return 0;
        }

在上述代碼中,分別為變量a、b和c賦了初始值,執(zhí)行后輸出:

        a=3, b=8, c=5

在Objective-C程序中,通過NSLog不僅可以顯示簡單的短語,而且還能顯示定義的變量值幵計算結(jié)果,在下面的實例中,使用NSLog顯示了10+20的結(jié)果。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int sum;

                sum = 10 + 20;
                NSLog (@"10和20的和是:%i", sum);
              }
              return 0;
        }

對于上述代碼的具體說明如下。

(1)函數(shù)main會自動執(zhí)行第一條程序語句,將變量sum定義為整型。在Objective-C程序中,在使用所有程序變量前必須先定義。定義變量的目的是告訴Objective-C編譯器程序?qū)⑷绾问褂眠@些變量。編譯器需要確保持久為這些信息生成正確的指令,便于將值存儲到變量中或者從變量中檢索值。被定義成int類型的變量只能夠存儲整型值,例如3,4, -10和0都是整型值。

(2)整型變量sum的功能是存儲整數(shù)10和20的和。在編寫上述代碼時,故意在定義這個變量的下方預留了一個空行,這樣做的目的是在視覺上區(qū)分例程的變量定義和程序語句。(注意:這種做法是一個良好的風格,在很多時候,在程序中添加單個空白行可使程序的可讀性更強。)

(3)代碼“sum = 10 + 20; ”的含義比較容易理解,表示數(shù)字10和數(shù)字20相加,幵把結(jié)果存儲到變量sum中。

(4)NSLog調(diào)用中有兩個參數(shù),這些參數(shù)用逗號隔開。NSLog的第一個參數(shù)是要顯示的字符串。然而在顯示字符串的同時,通常還希望要顯示某些程序變量的值。在上述代碼中,要顯示變量sum的值:

        10和20的和是:

第一個參數(shù)中的百分號是一個特殊字符,它可以被函數(shù)NSLog識別。緊跟在百分號后的字符指定在這種情況下將要顯示的值類型。在實例2-9的程序中,字母i被NSLog識別,它表示將要顯示的是一個整數(shù)。只要NSLog在字符串中發(fā)現(xiàn)字符“%i”,它都將自動顯示第二個參數(shù)的值。因為sum是NSLog的下一個參數(shù),所以它的值將在“10和20的和是”之后自動顯示。

實例2-9的代碼執(zhí)行后會輸出:

        10和20的和是: 30

2.3.2 統(tǒng)一定義變量

實例2-10的代碼中統(tǒng)一定義了變量value1、value2和sum。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                int value1, value2, sum;
                value1 = 10;
                value2 = 20;
                sum = value1 + value2;
                NSLog (@"The sum of %i and %i is %i", value1, value2, sum);
              }
              return 0;
        }

對于上述代碼的具體說明如下。

(1)函數(shù)main中的第二條語句定義了3個int類型變量,分別是value1、value2和sum。這條語句可以等價于如下3條獨立的語句。

        int value1;
        int value2;
        int sum;

在定義了上述3個變量之后,程序?qū)⒄麛?shù)10賦值給變量value1,將整數(shù)20賦值給變量value2,然后計算這兩個整數(shù)的和,幵將計算結(jié)果賦值給變量sum。

(2)NSLog例程的調(diào)用包含4個參數(shù)。通常將其第一個參數(shù)稱為格式字符串,此參數(shù)能夠向系統(tǒng)描述其余參數(shù)的顯示方式。value1的值將在The sum of之后顯示。同理,將在適當?shù)奈恢幂敵鰒alue2和sum的值,這個位置由格式字符串后面的兩個“%i”來指定。

執(zhí)行上述代碼后會輸出:

        The sum of 10 and 20 is 30

除此之外,Objective-C硬性規(guī)定:

?變量和函數(shù)名由字母、數(shù)字和下劃線“_”組成。

?第一個字符必須是下劃線或字母。

?變量和函數(shù)名是區(qū)分大小寫的,例如,bandersnatch和Bandersnatch是表示不同意義的名稱。

?在一個名稱的中間不能有任何空白。

例如,下面是一些合法的名稱。

        j
        aaa2012
        aaa_bbb_ccc
        aaabbbccc

而下面的名稱是不合法的。

        2012Year
        aaa&bbb
        I love you

2.4 字符串

知識點講解:光盤:視頻\知識點\第2章\字符串.mp4

在Objective-C程序中,字符串常量是由@和一對雙引號括起的字符序列。比如,@"CHINA"、@"program"、@"$12.5" 等都是合法的字符串常量。它與C語言中字符串的區(qū)別是增加了“@”。

字符串常量和字符常量是不同的量,主要有如下兩點區(qū)別。

(1)字符常量由單引號括起來,字符串常量由雙引號括起來。

(2)字符常量只能是單個字符,字符串常量則可以含一個或多個字符。

在Objective-C語言中,字符串不是作為字符的數(shù)組被實現(xiàn)的。在Objective-C中的字符串類型是NSString,它不是一個簡單數(shù)據(jù)類型,而是一個對象類型,這是與C++語言不同的。我們會在后面的章節(jié)中詳細介紹NSString。例如下面是一個簡單使用NSString的例子。

實例文件main.m的具體實現(xiàn)代碼如下所示。

        #import <Foundation/Foundation.h>

        int main(int argc, const char * argv[]) {
              @autoreleasepool {
                // insert code here...
                NSLog(@"Programming is牛!");
              }
              return 0;
        }

上述代碼和本書的第一段Objective-C程序類似,運行后會輸出:

        Programming is牛!
主站蜘蛛池模板: 洪江市| 鄂伦春自治旗| 阳新县| 芮城县| 平阳县| 福贡县| 晋宁县| 汉寿县| 东平县| 保定市| 西乌珠穆沁旗| 南皮县| 龙里县| 内江市| 登封市| 枣庄市| 石泉县| 建平县| 罗甸县| 宜兰县| 准格尔旗| 遂昌县| 察雅县| 九龙坡区| 陆河县| 深泽县| 疏勒县| 攀枝花市| 苍梧县| 六安市| 阿拉尔市| 大港区| 青州市| 宜城市| 曲靖市| 西丰县| 曲周县| 开封县| 阿巴嘎旗| 辽阳市| 巢湖市|