iOS資料型別簡介及NSLog列印輸出
1. 資料型別簡介及輸出
(1) 資料型別簡介
資料型別簡介 : Object - C 資料型別 分為 基本資料型別, 構造型別 和 指標型別;
-- 基本資料型別 : 整型, 字元型, 浮點型 (float 和 double), 列舉型;
-- 構造型別 : 陣列型別, 結構體型別, 共用體型別;
-- 指標型別 : 最終要的資料型別, 所有的系統類, 自定義類都是指標;
-- 空型別 : 空型別只有一個值 nil, 該型別沒有名稱, 因此沒有空型別的變數, 變數不能轉換成空型別, 但是空型別可以轉換成任何引用型別;
(2) 資料型別輸出
NSLog()簡介 : NSLog 是 Foundation 框架中功能強大的函式, 可以輸出任何型別的資料;
-- 佔位符 : NSLog() 函式中各式與 C 語言中大致相似, 第一個引數是加了 @ 的字串, 後面的引數是用於替換佔位符的;
整型佔位符說明 :
-- %d : 十進位制整數, 正數無符號, 負數有 "-" 符號;
-- %o : 八進位制無符號整數, 沒有 0 字首;
-- %x : 十六進位制無符號整數, 沒有 0x 字首;
-- %u : 十進位制無符號整數;
字元佔位符說明 :
-- %c : 單個字元輸出;
-- %s : 輸出字串;
浮點佔位符說明 :
-- %f : 以小數形式輸出浮點數, 預設 6 位小數;
-- %e : 以指數形式輸出浮點數, 預設 6 位小數;
-- %g : 自動選擇 %e 或者 %f 各式;
其它形式佔位符 :
-- %p : 輸出十六進位制形式的指標地址;
-- %@ : 輸出 Object-C 物件;
佔位符附加字元 :
-- l : 在整型 和 浮點型佔位符之前, %d %o %x %u %f %e %g 代表長整型 和 長字串;
-- n(任意整數) : %8d 代表輸出8位數字, 輸出總位數;
-- .n : 浮點數 限制小數位數, %5.2f 表示 5位數字 2位小數, 字串 擷取字元個數;
-- - : 字元左對齊;
示例程式碼 :
- #import <Foundation/Foundation.h>
- int main(int argc, charchar **argv)
- {
- @autoreleasepool{
- int a = 38;
- long b = 38;
- double c = 3.8;
- double d = 2.3;
- charchar * oct_c = "Octopus";
- NSString *oct_oc = @"Octopus"; /* 定義字串, 在字串前加上 @ 說明是Ovject-C變數, 值賦給一個 NSString 指標 */
- NSDate *date = [[NSDate alloc]init];
- NSLog(@"%d 十進位制整型", a);
- NSLog(@"%5d 五位十進位制整型", a);
- NSLog(@"%-5d 左對齊的五位十進位制整型", a);
- NSLog(@"%o 八進位制整型", a);
- NSLog(@"%x 十六進位制整型\n", a);
- NSLog(@"%ld 長整型", b);
- NSLog(@"%lx 十六進位制長整型\n", b);
- NSLog(@"%f 小數形式輸出浮點數", c);
- NSLog(@"%e 指數形式輸出浮點數", c);
- NSLog(@"%g 以最簡短形式輸出浮點數", c);
- NSLog(@"%5f 以五位小數形式輸出浮點數", c);
- NSLog(@"%5.3f 小數行書輸出, 一共五位, 小數3位\n", c);
- NSLog(@"%lf 小數形式輸出長浮點數", d);
- NSLog(@"%le 指數形式輸出長浮點數", d);
- NSLog(@"%lg 以最短形式輸出長浮點數", d);
- NSLog(@"%5lf 5位小數形式輸出長浮點數", d);
- NSLog(@"%5.3lf 5位小數形式輸出長浮點數, 其中3位是小數\n", d);
- NSLog(@"%s 輸出C字串", oct_c);
- NSLog(@"%@ 輸出Object-C字串\n", oct_oc);
- NSLog(@"%@ 輸出日期", date);
- }
- }
- 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 十進位制整型
- 2014-08-16 19:32:44.212 a.out[1300:507] 38 五位十進位制整型
- 2014-08-16 19:32:44.213 a.out[1300:507] 38 左對齊的五位十進位制整型
- 2014-08-16 19:32:44.214 a.out[1300:507] 46 八進位制整型
- 2014-08-16 19:32:44.214 a.out[1300:507] 26 十六進位制整型
- 2014-08-16 19:32:44.215 a.out[1300:507] 38 長整型
- 2014-08-16 19:32:44.215 a.out[1300:507] 26 十六進位制長整型
- 2014-08-16 19:32:44.216 a.out[1300:507] 3.800000 小數形式輸出浮點數
- 2014-08-16 19:32:44.216 a.out[1300:507] 3.800000e+00 指數形式輸出浮點數
- 2014-08-16 19:32:44.217 a.out[1300:507] 3.8 以最簡短形式輸出浮點數
- 2014-08-16 19:32:44.217 a.out[1300:507] 3.800000 以五位小數形式輸出浮點數
- 2014-08-16 19:32:44.218 a.out[1300:507] 3.800 小數行書輸出, 一共五位, 小數3位
- 2014-08-16 19:32:44.218 a.out[1300:507] 2.300000 小數形式輸出長浮點數
- 2014-08-16 19:32:44.219 a.out[1300:507] 2.300000e+00 指數形式輸出長浮點數
- 2014-08-16 19:32:44.219 a.out[1300:507] 2.3 以最短形式輸出長浮點數
- 2014-08-16 19:32:44.219 a.out[1300:507] 2.300000 5位小數形式輸出長浮點數
- 2014-08-16 19:32:44.220 a.out[1300:507] 2.300 5位小數形式輸出長浮點數, 其中3位是小數
- 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 輸出日期
(1) 整型型別介紹
四種整型 :
-- short int : 短整型, 佔16位, mac 上佔 2 位元組, iOS 上佔 2 位元組, 範圍 -32768(-2^15) ~ 32767(2^15 - 1), 3萬;
-- int : 整型, 佔32位, mac 上佔 4 位元組, ios 上佔 4 位元組, 範圍 -2147483648(-2^31) ~ 2147483647(2^31 - 1), 21億;
-- long int : 長整型, 佔64位, mac 上佔 8 位元組, ios 上佔 4 位元組, (-2^63) ~ (2^63 - 1), 922億億;
-- long long : 佔64位, mac 上佔 8 位元組, ios 上佔 8 位元組;
整數賦值 : 整型賦值時注意範圍, 如果超出賦值範圍, 會出現警告, 資料也會丟失;
-- 示例程式 :
- /*************************************************************************
- > File Name: a.m
- > Author: octopus
- > Mail: octopus_truth.163.com
- > Created Time: 日 8/17 00:44:19 2014
- ************************************************************************/
- #import <Foundation/Foundation.h>
- int main(int argc, charchar * argv[])
- {
- @autoreleasepool {
- short int a = 50000; /* short int 範圍是 正負3萬, 因此超出範圍報錯 */
- int a = 50000;
- NSLog(@"short int a = %d", a);
- NSLog(@"int a = %d", a);
- }
- }
-- 執行結果 :
- 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) 進位制介紹
八進位制 十六進位制賦值 : 八進位制由 "0" 開頭, 十六進位制由 "0x" 或者 "0X" 開頭;
-- 示例程式 :
- #import <Foundation/Foundation.h>
- int main(int argc, charchar **argv)
- {
- @autoreleasepool
- {
- int a = 010; /* 八進位制賦值 */
- int b = 0x10; /* 十六進位制賦值 */
- int c = 10; /* 正常十進位制賦值 */
- NSLog(@"a = %d", a);
- NSLog(@"b = %d", b);
- NSLog(@"c = %d", c);
- NSLog(@". . . . . ");
- NSLog(@"a = %o", a);
- NSLog(@"b = %x", b);
- }
- return 0;
- }
-- 執行結果 :
- 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) 無符號整型
無符號整型 : 無符號整型 第一位 不是符號位, 範圍比原來要大, 例如 short int 範圍是 正負3萬, unsigned short int 範圍是 0到6萬, 將5萬賦值給 該型別不報錯;
-- 示例程式 :
- /*************************************************************************
- > File Name: 03-IntDemo2.m
- > Author: octopus
- > Mail: octopus_truth.163.com
- > Created Time: 日 8/17 01:02:39 2014
- ************************************************************************/
- #import <Foundation/Foundation.h>
- int main(int argc, charchar * argv[])
- {
- @autoreleasepool {
- unsigned short int a = 50000;
- NSLog(@"a = %d", a);
- }
- }
-- 執行結果 :
- 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
字元型資料簡介 :
-- 單個字元表示 : 使用 '' 將單個字元引起來, 便是字元常量, 如 'a', 'b' 等;
-- 轉義字元表示 : 使用轉義符號 \ 來指定字元, 如 '\n' 等;
-- 字元佔用空間大小 : 每個字元佔用一個位元組, 因此 Object-C 不支援中文字元, 因為中文字元都是佔 2 ~ 3 個位元組;
轉義字元 : 分為特殊空白字元 和 區別 單雙引號 和 反斜線的轉義;
-- 退格符 : '\b' ;
-- 換行符 : '\n' ;
-- 回車符 : '\r' ;
-- 製表符 : '\t' ;
-- 雙引號 : '\"' ;
-- 單引號 : '\'' ;
-- 反斜線 : '\\' ;
int 與 char 型別關係 : char 型別可以當做 8 位無符號整數, 取值範圍 0 ~ 255;
-- int 賦值給 char : 將 int 型別賦值給 char 變數的時候, 會自動將型別轉為 char 型別;
char 型別 示例 :
- /*************************************************************************
- > File Name: 05-charDemo.m
- > Author: octopus
- > Mail: octopus_truth.163.com
- > Created Time: 二 8/19 21:10:37 2014
- ************************************************************************/
- #import <Foundation/Foundation.h>
- int main(int argc, charchar * argv[])
- {
- @autoreleasepool {
- char a = 'a';
- char b = 100;
- char c = '\n';
- NSLog(@"a = %d", a);
- NSLog(@"b = %c", b);
- NSLog(@"c = %d", c);
- }
- }
- 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. 浮點型
浮點型資料型別 :
-- float : 佔 4 位元組;
-- double : 佔 8 位元組;
-- long double : 佔 16 位元組;
浮點數表示形式 :
-- 十進位制形式 : 簡單的浮點數, 包含一個小數點, 如 3.8, 38.0, .38 等;
-- 科學計數法 : 3.8E2 或者 3.8e2 代表 3.8*10^2, 只有浮點數才能使用科學計數法;
Object-C 與 Java 浮點數區別 :
-- Java 浮點數 : Java 的 double 與 float 不同, 浮點數賦值給 float 需要加上 f 字尾;
-- Object-C浮點數 : 不區分 double 與 float, 一個浮點數 3.8 可以賦值給兩種型別的變數;
浮點數的特殊值 :
-- 正無窮大 : 正浮點數除以 0.0 得到正無窮大, 正無窮大都相等, 正整數除以 0.0 得到整數的邊界值, short int 除以 0.0 得到 32767(2^15 -1);
-- 負無窮大 : 負浮點數除以 0.0 得到負無窮大, 負無窮大都相等, 負整數除以 0.0 得到整數的邊界值, short int 除以 0.0 得到 -32768(2^15);
-- 非數 : 0.0 除以 0.0 得到一個非數, 非數與任何數包括其本身都不相等;
程式碼示例 :
- /*************************************************************************
- > File Name: 06-floatDemo.m
- > Author: octopus
- > Mail: octopus_truth.163.com
- > Created Time: 三 8/20 01:08:35 2014
- ************************************************************************/
- #import <Foundation/Foundation.h>
- int main(int argc, charchar * argv[])
- {
- @autoreleasepool {
- /* 定義的10位的小數, 使用10位 %g 格式輸出, 結果 float 只能接收6位小數 */
- 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(@"正無窮大對比結果 = %d", 5.0/0.0 == 500/0.0);
- double feiNum = 0.0 / 0.0;
- NSLog(@"0.0 / 0.0 = %g", feiNum);
- NSLog(@"非數對比結果 = %d", feiNum == feiNum);
- /* 獲取邊界 */
- int bound1 = 5/0.0;
- int bound2 = -5/0.0;
- NSLog(@"正邊界 = %d, 負邊界 = %d", bound1, bound2);
- }
- }
- 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] 正無窮大對比結果 = 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] 非數對比結果 = 0
- 2014-08-20 01:22:22.715 a.out[776:507] 正邊界 = 2147483647, 負邊界 = -2147483648
-- 注意情況 : 不能將 5/0.0 直接以 %d 形式列印, 否則會報以下錯誤;
- 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, 負邊界 = %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, 負邊界 = %d", 5/0.0, -5/0.0);
- ~~ ^~~~~~
- %f
- 2 warnings generated.
(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 兩個變數的取值只能是 day 列舉中定義的值;
列舉變數賦值 : 格式 variable = elm1 ;
-- 示例 : today = Sunday; tomorrow = Friday;
(2) 定義匿名列舉
匿名列舉格式 : enum {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} today, tomorrow ;
-- 說明 : 兩個列舉變數 today 和 tomorrow 只能取值 enum 中得列舉值;
(3) 列舉值簡介
列舉值常量 : 在 {} 中得是列舉常量 或者 列舉元素, 該元素不是變數, 不能對齊進行賦值, 列舉的值按照定義的順序 0, 1, 2, 3 以此類推;
列舉值本質 : 列舉值屬於無符號整數, 可以使用 %u 佔位符列印出來, 其值也能進行大小比較, 和四則運算;
列舉初值 : 列舉值可以在定義的時候賦予一個初值;
(4) 列舉示例
示例程式 :
- /*************************************************************************
- > File Name: 07-enumDemo.m
- > Author: octopus
- > Mail: octopus_truth.163.com
- > Created Time: 四 8/21 21:36:09 2014
- ************************************************************************/
- #import <Foundation/Foundation.h>
- int main(int argc, charchar * argv[])
- {
- @autoreleasepool {
- /* 定義一個列舉 */
- 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);
- }
- }
- 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. 布林型資料
BOOL 型別簡介 :
-- BOOL 型別值 : 該型別至右兩個值 YES 和 NO ;
-- BOOL 型別本質 : 該型別本質是 signed char, YES 是 1, NO 是 0, 在處理的時候 YES 會被當成真處理, NO 會被當成假處理;
定義 BOOL 型別的系統原始碼 :
- #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 <Foundation/Foundation.h>
- /* 判斷 a 是否大於 b */
- BOOL isBig(int a, int b)
- {
- if(a > b)
- {
- return YES;
- }
- return NO;
- }
- int main(int argc, charchar * 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);
- }
- }
- 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 型別會將非 0 數字當做 YES 處理;
-- 大數字賦值 : 注意 BOOL 型別只有 8 位, 賦值的時候, 只要最後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 <Foundation/Foundation.h>
- int main(int argc, charchar * 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.
- 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
相關文章
- JavaScript資料型別及輸出JavaScript資料型別
- int型別按位元組列印輸出型別
- clickhouse資料型別簡介資料型別
- service型別及功能簡介+pod型別型別
- Redis7新特性簡介及十大資料型別Redis大資料資料型別
- std::cout 輸出 unsigned char型別資料型別
- NumPy 陣列切片及資料型別介紹陣列資料型別
- [java IO流]之 基本資料型別輸入輸出流Java資料型別
- Java資料型別及型別轉換Java資料型別
- 【Redis】資料型別介紹Redis資料型別
- Rust 資料型別介紹Rust資料型別
- iOS CocoaPods簡介及基本使用iOS
- 演示 資料型別 陣列名[]=new 資料型別[大小],迴圈輸入5個成績,儲存到double陣列,並輸出資料型別陣列
- Redis 資料型別及操作Redis資料型別
- 資料型別及轉換資料型別
- 學習變數的目的及基本資料型別介紹變數資料型別
- 基本資料型別與引用資料型別,及記憶體分配資料型別記憶體
- printf 中 % 別代表的輸出型別型別
- C++ 引用型別簡介C++型別
- Oracle字串資料型別簡述Oracle字串資料型別
- Redis Hashes 資料型別簡述Redis資料型別
- redis-資料型別及命令Redis資料型別
- js資料型別及判斷JS資料型別
- iOS 使用正則判斷輸入型別iOS型別
- 資料湖架構及概念簡介架構
- android AIDL程式間通訊(只介紹了簡單資料型別)AndroidAI資料型別
- C語言資料型別、變數的輸入和輸出、進位制轉換C語言資料型別變數
- WebRTC:資料傳輸相關協議簡介Web協議
- 不簡單的基本資料型別資料型別
- 如何簡單實現關聯型別資料的Excel匯出?型別Excel
- C++ 使用者輸入與資料型別詳解:建立基本計算器及變數型別C++資料型別變數
- 資料型別及拆箱裝箱資料型別
- 簡單型別與複雜型別及原型鏈型別原型
- golang資料型別基本介紹與使用Golang資料型別
- GBase8s資料型別介紹資料型別
- 簡單資料型別和引用資料型別對應棧和堆示意圖資料型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- iOS資料傳輸工具iOS