數據類型、 運算符和表達式在任何的計算機語言中都比較重要的,?
在面向對象的Objective-C語言中, 除了常規的基本類型, 還有對象類型等。?
運算符和表達式完全遵守C語言規范。
Objective-C數據類型可以分為:基本數據類型、 對象類型和id類型。?
> 基本數據類型有: int、 float、 double和char類型。?
對象類型就是類或協議所聲明的指針類型, 例如:
NSAutoreleasePool * pool, 其中NSAutoreleasePool是一個類,
NSAutoreleasePool *是它指針類型。?
id類型可以表示任何類型,?也就是說id可存儲任何類型的對象。?
一般只是表示對象類型, 不表示基本數據類型,從某種意義上說,它是一般對象類型。
所以剛才的變量pool也可以聲明為id pool。
id類型是Objective-C中十分重要的特性,它是多態和動態綁定的基礎。
## 基本數據類型
### 1、int類型
int類型代表整數, 它的十六進制表示方式: 0xFFED0D,?
在使用 NSLog函數中格式化字符串使用 %i表示十進制的整數,?
%o(字母o) 表示8進制整數, %#x表示十六進制整數。?
NSLog(@"integerVar = %i", integerVar);
整數常量由一個或多個數字的序列組成。
它的取值范圍是與設備相關的, 無法一概而論。
也就是要注意設備或機器相關量。即我們通常說的int是32位還是64位取決于CPU的總線寬度。
在Mac OS X中,提供了選擇應用程序是在32位還是64位下編譯。
在前一種情況下,一個int占用32位;在后一種情況下,一個int占用64位。
### 2、float類型
聲明為float類型的變量可以存儲包含小數位的值。
float類型代表單精度浮點數, 要表示float類型浮點數, 可以在數值后面加上f或F, 例如:13.5f。?
float浮點數也可以用科學計數法表示, 例如: 1.7e4。?
NSLog函數中格式化字符串: %f表示浮點數, %e表示科學計數法, %g表示浮點數。?
~~~
float?floatingVar?=?3.141592;??
NSLog(@"floatingVar?=?%f",?floatingVar);??
~~~
這里的輸出結果為floatingVar =3.141592
這說明實際顯示的值是由具體使用的計算機系統決定的。
出現這種不準確值的原因在于,計算機內部使用了特殊的方式表示數字。
同樣的不確定性也出現在:在計算機內存中不能精確地表示一些浮點值。
所以,我們在進行float或double的值比較時,一定要考慮這一點。
這也是為什么float值和0相等的比較需要寫成下面表達式的原因:
if(x>0.000001&&x<-0.000001)
### 3、double類型
double類型代表雙精度浮點數, 與float類型很相似, 占用的字節空間double類型大體上是float類型的兩倍。?
大多數計算機是用 64位表示double類型。
NSLog函數中格式化字符串, 與float的%f、 %e和 %g相同。?
NSLog(@"doubleVar = %e", doubleVar);
### 4、char類型
char類型代表字符類型,char變量可存儲單個字符。將字符放入一對單引號中就能得到字符常量。如:’a‘。
不要把字符常量和c語言風格的字符串混為一談,字符常量是放在單引號中的字符,而字符串則是放在雙引號中的任意個數的字符。
如果要表示一些特殊字符, 要使用轉義字符“\” 。?
字符常量’\n‘(即換行符)是一個合法的字符常量,盡管它似乎與前面提到的規則矛盾。
NSLog(@"charVar = %c", charVar);
下面舉個例子來演示以上類型的使用:
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
????int?integerVar?=?100;??
????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);??
??????
????[pool?drain];??
????return?0;?????
}??
~~~
## 數據類型限定詞
Obejctive-C中數據類型可以在int、 float、 double和char類
前面加上限定詞, 限定詞有: long、 long long、 short、
unsigned和signed, 這些限定詞從而增強了基本類型。
? long int,
如果直接把限定詞long放在int聲明之前,那么所聲明的整型變量在某些計算機上具有擴展的值域。
long變量的具體范圍也是由計算機系統決定的。
在大部分計算機中代表32位整數, 在整數后面加L(或l) 表示,?
例如: long int numberOfPoints =131071100L,
?NSLog函數中格式化字符串使用 %li表示;?
? long long int可以指定更加寬泛的整數類型, 保證變量至少64位寬度。
?NSLog函數中格式化字符串使用 %lli表示;?
? long double , 可以指定更加寬泛的double類型,?
要顯示這個可以在尾部使用 L(大小寫) 表示, 1.234e+7L。?
NSLog函數中格式化字符串使用 %Lf、 %Le和%Lg表示;
??short int用來指定存放相對小的整數,?節約內存,
一般是占用 int類型的一半。 大部分計算機是16位;?
? unsigned int, 告訴編譯器只是接受整數,?
在數值之后放字母u(或U) 表示, 例如: 0x00ffU;?
編寫整數時候, 可以將字母u(或U) 和l(或L) 組合起來,
例如: 20000UL;?
? signed char, 代表的字符與編譯器有關, 一般也作為無符合整數使用。
## 布爾類型和枚舉類型
Objective-C還有兩種數據類型是以int類型在計算機內部存儲的, 它們是: 布爾類型和枚舉類型。?
?布爾類型是_Bool(別名 BOOL), 取值范圍1或0,?
其中1可以用TRUE和YES表示, 0可以用 FALSE和NO表示。?
?枚舉類型,如果需要定義一組相關常量, 可以采用枚舉類型,?把這些常量定義成一個類型,?
例如游戲在上、 下、 左、 右方向,?
可以枚舉類型:?
enum direction {up,down,left,right};
其中up從0開始,?down是1, 依次類推加1
枚舉類型實例:
~~~
#import???
??
int?main?(int?argc,?const?charchar?*?argv[])?{??
????NSAutoreleasePool?*?pool?=?[[NSAutoreleasePool?alloc]?init];??
??????
????enum?week?{??
????????Mon,?Tue,?Wed,?Thu,?Fri,?Sat,?Sun??
????};??
??????
????int?days,aweek;??
????//aweek?=?0;??
??????
????NSLog(@"Enter?week?number?:?");??
??????
????scanf("%i",?&aweek);??
??????
????switch?(aweek)?{??
????????case?Mon:??
????????????break;??
????????case?Tue:??
????????????break;??
????????case?Wed:??
????????????break;??
????????case?Thu:??
????????????break;??
????????case?Fri:??
????????????break;??
????????case?Sat:??
????????????days?=?5;??
????????????break;??
????????case?Sun:??
????????????days?=?6;??
????????????break;??
????????default:??
????????????NSLog(@"bad?week?number");??
????????????days?=?-1;?????????????
????}??
??????
????if?(days?!=0)?{??
????????NSLog(@"Number?of?days?is?%i",?days);??
????}??
??????
????[pool?drain];??
????return?0;??
??????
}??
~~~
代碼解釋說明:
其中定義了week的枚舉類型,?
函數scanf("%i ", &aweek) 是C中標準函數庫, 用于從終端讀取鍵盤輸入, %i 是指定接收的類型,?
&aweek是傳遞aweek的地址給函數, 便于接收鍵盤輸入內容。
## 數據類型轉換
按照數據類型占用存儲不同可以自動類型轉換或強制類型轉換,?
總的原則是小存儲容量數據類型可以自動轉換成為大存儲容量數據類型。?
不同類型數據間按照下面關系的從左到右(從低到高) 自動轉換:?
_Bool 、 char、 short int、 枚舉類型 -> int ->long int->long long-> float -> double -> long double。
類型轉換先后順序表:

數據類型轉換舉例:
如果有表示式f * i + l /s, 其中, f是float類型, i 為int類型, l
為long int 類型, s為short int類型, 結果是什么類型??
答案:運行結果為float類型,?
這是因為f是float其它的操作數與float運算其結果就是float類型。
## 強制類型轉換
如果遵守類型轉換是右到左情況, 就需要強制類型轉換了,?
強制類型轉換語法形式上很簡單, 就是在數據前面加上(目標類型) ,?
但是這種轉換是存在風險的, 有可能造成數據的丟失, 需要謹慎進行。
例如:
~~~
long int l = 6666666666;
NSLog(@"l = %li",l );
int i = (int)l;
NSLog(@"i = %i",i );
~~~
運行結果:
~~~
l = 6666666666
i = -1923267926
~~~
~~~
int total = 3446;
int n = 6;
float average = total / n;
~~~
運行結果:
`average結果是574`
~~~
int total = 3446;
int n = 6;
float average = (float) total / n;
~~~
運行結果:
~~~
average結果是574.333
~~~
### 常量與變量
在Objective-C中,任何數字、單個字符和字符串通常都稱為常量。
完全由常量值組成的表達式叫常量表達式。
Objective-C中聲明常量使用關鍵字const:
?const double PI = 3.141592654;?
Objective-C中變量可以分為成員變量、 局部變量和全局變量。?
舉例如下:
~~~
int gCounter;
@interface MyObject : NSObject {
int counter;
}@end
@implementation MyObject
-(void) print {
int cter = 0;
NSLog(@"%i", cter );
}@end
~~~
其中:
gCounter:全局變量;
counter?:?成員變量;
cter ? ?:?局部變量。
### 更多了解:
基本數據類型表:
|類型 | 常量實例 |NSlog字符|
|---|---|---|
| Char | ‘a’,’/n’ | %c |
| Short int | -- | %hi,%hx,%ho |
| Unsigned short int | -- | %hu,%hx,%ho|
| Int | 12,-97,0xFFE0,0177 | %i,%x,%o|
| Unsigned int | 12u,100U,0xFFu | %u,%x,%o |
| Long int | 12L,-200l,0xffffL| %li,%lx,%lo |
| Unsigned long int | 12UL,100ul,0xffeeUL| %lu,%lx,%lo |
| Long long int | 0xe5e5c5e5LL,500ll | %lli,%llx,%llo|
| Unsigned long long int | 12ull,0xffeeULL | %llu,%llx,%llo|
| Float| 12.34f,3.1e-5f, | %f,%e,%g,%a|
|Double | 12.34,3.1e-5,0x.1p3 | %f,%e,%g,%a|
| Long double | 12.34l,3.1e-5l| %Lf,%Le,%Lg |
| id | nil | %p|
#### NSLog的定義
NSLog定義在NSObjCRuntime.h中,如下所示:
> ### void NSLog(NSString *format, …);
基本上,NSLog很像printf,同樣會在console中輸出顯示結果。
不同的是,傳遞進去的格式化字符是NSString的對象,而不是chat *這種字符串指針。
示例:
NSLog可以如下面的方法使用:
~~~
NSLog (@"this is a test");
NSLog (@"string is :%@", string);
NSLog (@"x=%d, y=%d", 10, 20);
~~~
但是下面的寫法是不行的:
~~~
int i = 12345;
NSLog( @"%@", i );
~~~
原因是, %@需要顯示對象,而int i明顯不是一個對象,要想正確顯示,要寫成:
~~~
int i = 12345;
NSLog( @"%d", i );
~~~
### NSLog格式:
NSLog的格式如下所示:
* %@ 對象
* %d, %i 整數
* %u 無符整形
* %f 浮點/雙字
* %x, %X 二進制整數
* %o 八進制整數
* %zu size_t
* %p 指針
* %e 浮點/雙字 (科學計算)
* %g 浮點/雙字?
* %s C 字符串
* %.*s Pascal字符串
* %c 字符
* %C unichar
* %lld 64位長整數(long long)
* %llu 無符64位長整數
* %Lf 64位雙字
### int 類型
如果整型值的第一位是0,那么這個整數將用八進制表示,在NSlog調用的格式符號:
%o 顯示的八進制值不帶有前導0
%#o 顯示的八進制值帶有前導0
如果整型常量以0x或0X開頭,那么這個整數將用十六進制表示,在NSlog調用的格式符號:
%x 顯示不帶前導0x,并用a-f之間的小寫字符表示十六進制
%#x 顯示帶前導0x,并用a-f之間的小寫字符表示十六進制
%X 顯示不帶前導0x,并用a-f之間的小寫字符表示十六進制
%#X 顯示帶前導0x,并用a-f之間的小寫字符表示十六進制
### float 類型
顯示浮點值,用NSlog轉換字符 %f
用科學計數法顯示浮點值,用NSlog轉換字符 %e
%g 充許NSlog確定使用常用的浮點計數顯示還是使用科學計數法顯示浮點值。(如果該值小于-4或大于5,采用%e科學計數法表示;否則采用%f浮點計數法顯示)