1. 數(shù)據(jù)類型簡(jiǎn)介及輸出
(1) 數(shù)據(jù)類型簡(jiǎn)介
數(shù)據(jù)類型簡(jiǎn)介: Object - C 數(shù)據(jù)類型 分為 基本數(shù)據(jù)類型, 構(gòu)造類型 和 指針類型;
--基本數(shù)據(jù)類型: 整型, 字符型, 浮點(diǎn)型 (float 和 double), 枚舉型;
--構(gòu)造類型: 數(shù)組類型, 結(jié)構(gòu)體類型, 共用體類型;
--指針類型: 最終要的數(shù)據(jù)類型,所有的系統(tǒng)類, 自定義類都是指針;
--空類型: 空類型只有一個(gè)值 nil, 該類型沒有名稱, 因此沒有空類型的變量, 變量不能轉(zhuǎn)換成空類型, 但是空類型可以轉(zhuǎn)換成任何引用類型;
(2) 數(shù)據(jù)類型輸出
NSLog()簡(jiǎn)介: NSLog 是 Foundation 框架中功能強(qiáng)大的函數(shù), 可以輸出任何類型的數(shù)據(jù);
--占位符: NSLog() 函數(shù)中各式與 C 語(yǔ)言中大致相似, 第一個(gè)參數(shù)是加了 @ 的字符串, 后面的參數(shù)是用于替換占位符的;
整型占位符說明:
--%d: 十進(jìn)制整數(shù), 正數(shù)無符號(hào), 負(fù)數(shù)有 "-" 符號(hào);
--%o: 八進(jìn)制無符號(hào)整數(shù), 沒有 0 前綴;
--%x: 十六進(jìn)制無符號(hào)整數(shù), 沒有 0x 前綴;
--%u: 十進(jìn)制無符號(hào)整數(shù);
字符占位符說明:
--%c: 單個(gè)字符輸出;
--%s: 輸出字符串;
浮點(diǎn)占位符說明:
--%f: 以小數(shù)形式輸出浮點(diǎn)數(shù), 默認(rèn) 6 位小數(shù);
--%e: 以指數(shù)形式輸出浮點(diǎn)數(shù), 默認(rèn) 6 位小數(shù);
--%g: 自動(dòng)選擇 %e 或者 %f 各式;
其它形式占位符:
--%p: 輸出十六進(jìn)制形式的指針地址;
--%@: 輸出 Object-C 對(duì)象;
占位符附加字符:
--l: 在整型 和 浮點(diǎn)型占位符之前, %d %o %x %u %f %e %g 代表長(zhǎng)整型 和 長(zhǎng)字符串;
--n(任意整數(shù)): %8d 代表輸出8位數(shù)字, 輸出總位數(shù);
--.n: 浮點(diǎn)數(shù)限制小數(shù)位數(shù), %5.2f 表示 5位數(shù)字 2位小數(shù), 字符串截取字符個(gè)數(shù);
---: 字符左對(duì)齊;
示例代碼:
#import
int main(int argc, char **argv)
{
@autoreleasepool{
int a = 38;
long b = 38;
double c = 3.8;
double d = 2.3;
char * oct_c = "Octopus";
NSString *oct_oc = @"Octopus"; /* 定義字符串, 在字符串前加上 @ 說明是Ovject-C變量, 值賦給一個(gè) NSString 指針 */
NSDate *date = [[NSDate alloc]init];
NSLog(@"%d 十進(jìn)制整型", a);
NSLog(@"%5d 五位十進(jìn)制整型", a);
NSLog(@"%-5d 左對(duì)齊的五位十進(jìn)制整型", a);
NSLog(@"%o 八進(jìn)制整型", a);
NSLog(@"%x 十六進(jìn)制整型\n", a);
NSLog(@"%ld 長(zhǎng)整型", b);
NSLog(@"%lx 十六進(jìn)制長(zhǎng)整型\n", b);
NSLog(@"%f 小數(shù)形式輸出浮點(diǎn)數(shù)", c);
NSLog(@"%e 指數(shù)形式輸出浮點(diǎn)數(shù)", c);
NSLog(@"%g 以最簡(jiǎn)短形式輸出浮點(diǎn)數(shù)", c);
NSLog(@"%5f 以五位小數(shù)形式輸出浮點(diǎn)數(shù)", c);
NSLog(@"%5.3f 小數(shù)行書輸出, 一共五位, 小數(shù)3位\n", c);
NSLog(@"%lf 小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)", d);
NSLog(@"%le 指數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)", d);
NSLog(@"%lg 以最短形式輸出長(zhǎng)浮點(diǎn)數(shù)", d);
NSLog(@"%5lf 5位小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)", d);
NSLog(@"%5.3lf 5位小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù), 其中3位是小數(shù)\n", d);
NSLog(@"%s 輸出C字符串", oct_c);
NSLog(@"%@ 輸出Object-C字符串\n", oct_oc);
NSLog(@"%@ 輸出日期", date);
}
}
執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 02-NSLogDemo.m
octopus-2:ios octopus$
octopus-2:ios octopus$ ./a.out
2014-08-16 19:32:44.210 a.out[1300:507] 38 十進(jìn)制整型
2014-08-16 19:32:44.212 a.out[1300:507]? ? 38 五位十進(jìn)制整型
2014-08-16 19:32:44.213 a.out[1300:507] 38? ? 左對(duì)齊的五位十進(jìn)制整型
2014-08-16 19:32:44.214 a.out[1300:507] 46 八進(jìn)制整型
2014-08-16 19:32:44.214 a.out[1300:507] 26 十六進(jìn)制整型
2014-08-16 19:32:44.215 a.out[1300:507] 38 長(zhǎng)整型
2014-08-16 19:32:44.215 a.out[1300:507] 26 十六進(jìn)制長(zhǎng)整型
2014-08-16 19:32:44.216 a.out[1300:507] 3.800000 小數(shù)形式輸出浮點(diǎn)數(shù)
2014-08-16 19:32:44.216 a.out[1300:507] 3.800000e+00 指數(shù)形式輸出浮點(diǎn)數(shù)
2014-08-16 19:32:44.217 a.out[1300:507] 3.8 以最簡(jiǎn)短形式輸出浮點(diǎn)數(shù)
2014-08-16 19:32:44.217 a.out[1300:507] 3.800000 以五位小數(shù)形式輸出浮點(diǎn)數(shù)
2014-08-16 19:32:44.218 a.out[1300:507] 3.800 小數(shù)行書輸出, 一共五位, 小數(shù)3位
2014-08-16 19:32:44.218 a.out[1300:507] 2.300000 小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)
2014-08-16 19:32:44.219 a.out[1300:507] 2.300000e+00 指數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)
2014-08-16 19:32:44.219 a.out[1300:507] 2.3 以最短形式輸出長(zhǎng)浮點(diǎn)數(shù)
2014-08-16 19:32:44.219 a.out[1300:507] 2.300000 5位小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù)
2014-08-16 19:32:44.220 a.out[1300:507] 2.300 5位小數(shù)形式輸出長(zhǎng)浮點(diǎn)數(shù), 其中3位是小數(shù)
2014-08-16 19:32:44.220 a.out[1300:507] Octopus 輸出C字符串
2014-08-16 19:32:44.220 a.out[1300:507] Octopus 輸出Object-C字符串
2014-08-16 19:32:44.226 a.out[1300:507] 2014-08-16 11:32:44 +0000 輸出日期
2. 整型
(1) 整型類型介紹
四種整型:
--short int: 短整型, 占16位, mac 上占 2 字節(jié), ios 上占 2 字節(jié), 范圍 -32768(-2^15) ~ 32767(2^15 - 1), 3萬;
--int: 整型, 占32位, mac 上占 4 字節(jié), ios 上占 4 字節(jié), 范圍 -2147483648(-2^31) ~ 2147483647(2^31 - 1), 21億;
--long int: 長(zhǎng)整型, 占64位, mac 上占 8 字節(jié), ios 上占 4 字節(jié), (-2^63) ~ (2^63 - 1), 922億億;
--long long: 占64位, mac 上占 8 字節(jié), ios 上占 8 字節(jié);
整數(shù)賦值: 整型賦值時(shí)注意范圍, 如果超出賦值范圍, 會(huì)出現(xiàn)警告, 數(shù)據(jù)也會(huì)丟失;
--示例程序:
/*************************************************************************
> File Name: a.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 日? 8/17 00:44:19 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
short int a = 50000; /* short int 范圍是 正負(fù)3萬, 因此超出范圍報(bào)錯(cuò) */
int a = 50000;
NSLog(@"short int a = %d", a);
NSLog(@"int a = %d", a);
}
}
--執(zhí)行結(jié)果:
octopus-2:~ octopus$ clang -fobjc-arc -framework Foundation a.m
a.m:14:7: error: redefinition of 'a' with a different type: 'int' vs 'short'
int a = 50000;
^
a.m:13:13: note: previous definition is here
short int a = 50000;
^
1 error generated.
(2) 進(jìn)制介紹
八進(jìn)制 十六進(jìn)制賦值: 八進(jìn)制由 "0" 開頭, 十六進(jìn)制由 "0x" 或者 "0X" 開頭;
--示例程序:
#import
int main(int argc, char **argv)
{
@autoreleasepool
{
int a = 010; /* 八進(jìn)制賦值 */
int b = 0x10; /* 十六進(jìn)制賦值 */
int c = 10; /* 正常十進(jìn)制賦值 */
NSLog(@"a = %d", a);
NSLog(@"b = %d", b);
NSLog(@"c = %d", c);
NSLog(@". . . . . ");
NSLog(@"a = %o", a);
NSLog(@"b = %x", b);
}
return 0;
}
--執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 03-IntDemo1.m
octopus-2:ios octopus$ ./a.out
2014-08-17 00:58:50.513 a.out[1726:507] a = 8
2014-08-17 00:58:50.516 a.out[1726:507] b = 16
2014-08-17 00:58:50.516 a.out[1726:507] c = 10
2014-08-17 00:58:50.516 a.out[1726:507] . . . . .
2014-08-17 00:58:50.517 a.out[1726:507] a = 10
2014-08-17 00:58:50.517 a.out[1726:507] b = 10
(3) 無符號(hào)整型
無符號(hào)整型: 無符號(hào)整型 第一位 不是符號(hào)位, 范圍比原來要大, 例如 short int 范圍是 正負(fù)3萬, unsigned short int 范圍是 0到6萬, 將5萬賦值給 該類型不報(bào)錯(cuò);
--示例程序:
/*************************************************************************
> File Name: 03-IntDemo2.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 日? 8/17 01:02:39 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
unsigned short int a = 50000;
NSLog(@"a = %d", a);
}
}
--執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 03-IntDemo2.m
octopus-2:ios octopus$ ./a.out
2014-08-17 01:03:35.508 a.out[1745:507] a = 50000
3. 字符型
字符型數(shù)據(jù)簡(jiǎn)介:
--單個(gè)字符表示: 使用 '' 將單個(gè)字符引起來, 便是字符常量, 如 'a', 'b' 等;
--轉(zhuǎn)義字符表示: 使用轉(zhuǎn)義符號(hào) \ 來指定字符, 如 '\n' 等;
--字符占用空間大小: 每個(gè)字符占用一個(gè)字節(jié), 因此 Object-C 不支持中文字符, 因?yàn)橹形淖址际钦?2 ~ 3 個(gè)字節(jié);
轉(zhuǎn)義字符: 分為特殊空白字符 和 區(qū)別 單雙引號(hào) 和 反斜線的轉(zhuǎn)義;
--退格符: '\b' ;
--換行符: '\n' ;
--回車符: '\r' ;
--制表符: '\t' ;
--雙引號(hào): '\"' ;
--單引號(hào): '\'' ;
--反斜線: '\\' ;
int 與 char 類型關(guān)系:char 類型可以當(dāng)做 8 位無符號(hào)整數(shù), 取值范圍 0 ~ 255;
--int 賦值給 char: 將 int 類型賦值給 char 變量的時(shí)候, 會(huì)自動(dòng)將類型轉(zhuǎn)為 char 類型;
char 類型 示例:
/*************************************************************************
> File Name: 05-charDemo.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 二? 8/19 21:10:37 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
char a = 'a';
char b = 100;
char c = '\n';
NSLog(@"a = %d", a);
NSLog(@"b = %c", b);
NSLog(@"c = %d", c);
}
}
執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 05-charDemo.m
octopus-2:ios octopus$ ./a.out
2014-08-19 21:13:24.815 a.out[441:507] a = 97
2014-08-19 21:13:24.816 a.out[441:507] b = d
2014-08-19 21:13:24.817 a.out[441:507] c = 10
4. 浮點(diǎn)型
浮點(diǎn)型數(shù)據(jù)類型:
--float: 占 4 字節(jié);
--double: 占 8 字節(jié);
--long double: 占 16 字節(jié);
浮點(diǎn)數(shù)表示形式:
--十進(jìn)制形式: 簡(jiǎn)單的浮點(diǎn)數(shù), 包含一個(gè)小數(shù)點(diǎn), 如 3.8, 38.0, .38 等;
--科學(xué)計(jì)數(shù)法: 3.8E2 或者 3.8e2 代表 3.8*10^2, 只有浮點(diǎn)數(shù)才能使用科學(xué)計(jì)數(shù)法;
Object-C 與 Java 浮點(diǎn)數(shù)區(qū)別:
--Java 浮點(diǎn)數(shù): Java 的 double 與 float 不同, 浮點(diǎn)數(shù)賦值給 float 需要加上 f 后綴;
--Object-C浮點(diǎn)數(shù): 不區(qū)分 double 與 float, 一個(gè)浮點(diǎn)數(shù) 3.8 可以賦值給兩種類型的變量;
浮點(diǎn)數(shù)的特殊值:
--正無窮大: 正浮點(diǎn)數(shù)除以 0.0 得到正無窮大, 正無窮大都相等, 正整數(shù)除以 0.0 得到整數(shù)的邊界值, short int 除以 0.0 得到 32767(2^15 -1);
--負(fù)無窮大: 負(fù)浮點(diǎn)數(shù)除以 0.0 得到負(fù)無窮大, 負(fù)無窮大都相等, 負(fù)整數(shù)除以 0.0 得到整數(shù)的邊界值, short int 除以 0.0 得到 -32768(2^15);
--非數(shù): 0.0 除以 0.0 得到一個(gè)非數(shù), 非數(shù)與任何數(shù)包括其本身都不相等;
代碼示例:
/*************************************************************************
> File Name: 06-floatDemo.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 三? 8/20 01:08:35 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
/* 定義的10位的小數(shù), 使用10位 %g 格式輸出, 結(jié)果 float 只能接收6位小數(shù) */
float a = 3.888888888;
NSLog(@"a = %10g", a);
/* double 類型也只能接收6位有效值 */
double b = 388.8888888;
NSLog(@"b = %10g", b);
NSLog(@"5.0 / 0.0 = %g", 5.0 / 0.0);
NSLog(@"正無窮大對(duì)比結(jié)果 = %d", 5.0/0.0 == 500/0.0);
double feiNum = 0.0 / 0.0;
NSLog(@"0.0 / 0.0 = %g", feiNum);
NSLog(@"非數(shù)對(duì)比結(jié)果 = %d", feiNum == feiNum);
/* 獲取邊界 */
int bound1 = 5/0.0;
int bound2 = -5/0.0;
NSLog(@"正邊界 = %d, 負(fù)邊界 = %d", bound1, bound2);
}
}
--執(zhí)行效果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 06-floatDemo.m
octopus-2:ios octopus$ ./a.out
2014-08-20 01:22:22.712 a.out[776:507] a =? ? 3.88889
2014-08-20 01:22:22.714 a.out[776:507] b =? ? 388.889
2014-08-20 01:22:22.714 a.out[776:507] 5.0 / 0.0 = inf
2014-08-20 01:22:22.714 a.out[776:507] 正無窮大對(duì)比結(jié)果 = 1
2014-08-20 01:22:22.715 a.out[776:507] 0.0 / 0.0 = nan
2014-08-20 01:22:22.715 a.out[776:507] 非數(shù)對(duì)比結(jié)果 = 0
2014-08-20 01:22:22.715 a.out[776:507] 正邊界 = 2147483647, 負(fù)邊界 = -2147483648
--注意情況: 不能將 5/0.0 直接以 %d 形式打印, 否則會(huì)報(bào)以下錯(cuò)誤;
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 06-floatDemo.m
06-floatDemo.m:29:44: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
NSLog(@"正邊界 = %d, 負(fù)邊界 = %d", 5/0.0, -5/0.0);
~~? ? ? ? ? ? ? ? ^~~~~
%f
06-floatDemo.m:29:51: warning: format specifies type 'int' but the argument has type 'double' [-Wformat]
NSLog(@"正邊界 = %d, 負(fù)邊界 = %d", 5/0.0, -5/0.0);
~~? ? ? ? ? ^~~~~~
%f
2 warnings generated.
5. 枚舉類型
(1) 定義普通枚舉
定義方式: 格式enum enum_name {elem1, elem2, elem3 ...};
--示例: enum day{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
定義枚舉變量: 格式enum enum_name var1, var2;
--示例: enum day today, tomorrow, 注意 today tomorrow 兩個(gè)變量的取值只能是 day 枚舉中定義的值;
枚舉變量賦值: 格式variable = elm1;
--示例: today = Sunday; tomorrow = Friday;
(2) 定義匿名枚舉
匿名枚舉格式: enum{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} today, tomorrow ;
--說明: 兩個(gè)枚舉變量 today 和 tomorrow 只能取值 enum 中得枚舉值;
(3) 枚舉值簡(jiǎn)介
枚舉值常量: 在 {} 中得是枚舉常量 或者 枚舉元素, 該元素不是變量, 不能對(duì)齊進(jìn)行賦值, 枚舉的值按照定義的順序 0, 1, 2, 3 以此類推;
枚舉值本質(zhì): 枚舉值屬于無符號(hào)整數(shù), 可以使用 %u 占位符打印出來, 其值也能進(jìn)行大小比較, 和四則運(yùn)算;
枚舉初值: 枚舉值可以在定義的時(shí)候賦予一個(gè)初值;
(4) 枚舉示例
示例程序:
/*************************************************************************
> File Name: 07-enumDemo.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 四? 8/21 21:36:09 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
/* 定義一個(gè)枚舉 */
enum day {Sunday = 6, Monday = 2, Tuesday, Wednesday, Thursday, Friday, Saturday};
/* 定義枚舉變量 */
enum day today, tomorrow;
/* 為枚舉變量賦值 */
today = Wednesday;
tomorrow = Thursday;
/* 打印枚舉值 */
NSLog(@"today = %u", today);
NSLog(@"tomorrow = %u", tomorrow);
enum {alive, die} state;
state = alive;
NSLog(@"state = %d",? state);
}
}
執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 07-enumDemo.m
octopus-2:ios octopus$ ./a.out
2014-08-21 21:49:01.414 a.out[664:507] today = 4
2014-08-21 21:49:01.416 a.out[664:507] tomorrow = 5
2014-08-21 21:49:01.416 a.out[664:507] state = 0
6. 布爾型數(shù)據(jù)
BOOL 類型簡(jiǎn)介:
--BOOL 類型值: 該類型至右兩個(gè)值 YES 和 NO ;
--BOOL 類型本質(zhì): 該類型本質(zhì)是 signed char,YES 是 1,NO 是 0, 在處理的時(shí)候YES 會(huì)被當(dāng)成真處理,NO 會(huì)被當(dāng)成假處理;
定義 BOOL 類型的系統(tǒng)源碼:
#define OBJC_BOOL_DEFINED
/// Type to represent a boolean value.
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#if __has_feature(objc_bool)
#define YES? ? ? ? ? ? __objc_yes
#define NO? ? ? ? ? ? ? __objc_no
#else
#define YES? ? ? ? ? ? ((BOOL)1)
#define NO? ? ? ? ? ? ? ((BOOL)0)
#endif
代碼示例:
/*************************************************************************
> File Name: 08-boolDemo.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 二? 8/26 00:29:58 2014
************************************************************************/
#import
/* 判斷 a 是否大于 b */
BOOL isBig(int a, int b)
{
if(a > b)
{
return YES;
}
return NO;
}
int main(int argc, char * argv[])
{
@autoreleasepool {
int a = 5;
int b = 3;
NSLog(@"a 是否大于 b : %d", isBig(a, b));
BOOL c = 1;
BOOL d = 2;
NSLog(@"c = %d", c);
NSLog(@"d = %d", d);
}
}
執(zhí)行結(jié)果:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 08-boolDemo.m
octopus-2:ios octopus$ ./a.out
2014-08-26 00:40:48.928 a.out[1758:507] a 是否大于 b : 1
2014-08-26 00:40:48.930 a.out[1758:507] c = 1
2014-08-26 00:40:48.931 a.out[1758:507] d = 2
BOOL 類型賦值:
--BOOL 類型判斷: BOOL 類型會(huì)將非 0 數(shù)字當(dāng)做 YES 處理;
--大數(shù)字賦值: 注意 BOOL 類型只有 8 位, 賦值的時(shí)候, 只要最后8位不為0, 那么 BOOL 類型就是 YES, 如果后 8 位為0, 那么 BOOL 為 NO;
--示例代碼:
/*************************************************************************
> File Name: 08-boolDemo1.m
> Author: octopus
> Mail: octopus_truth.163.com
> Created Time: 二? 8/26 00:48:05 2014
************************************************************************/
#import
int main(int argc, char * argv[])
{
@autoreleasepool {
BOOL a = 256;
BOOL b = 512;
NSLog(@"a = %d", a);
NSLog(@"b = %d", b);
}
}
--編譯警告:
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 08-boolDemo1.m
08-boolDemo1.m:13:12: warning: implicit conversion from 'int' to 'BOOL' (aka 'signed char') changes value from 256 to 0
[-Wconstant-conversion]
BOOL a = 256;
~? ^~~
08-boolDemo1.m:14:12: warning: implicit conversion from 'int' to 'BOOL' (aka 'signed char') changes value from 512 to 0
[-Wconstant-conversion]
BOOL b = 512;
~? ^~~
2 warnings generated.
--執(zhí)行結(jié)果:
octopus-2:ios octopus$ ./a.out
2014-08-26 00:50:00.705 a.out[1802:507] a = 0
2014-08-26 00:50:00.708 a.out[1802:507] b = 0