2017年1月5日 星期四

Ch06 - 介紹 Objective-C 的流程控制

Objective-C 程式設計學習筆記 Ch06

  • Ch06-介紹 Objective-C 的流程控制。
  • 本章會介紹 if, switch 以及 三元運算子。

目錄:

  • (1) if 敘述
  • (2) switch 敘述
  • (3) 三元運算子
if 敘述我們在上一章節已有稍微介紹,在這章節會介紹得更深入一點點...。

(1) if 敘述

if 敘述用來根據判斷的條件,判斷執行哪一段程式。以口語化的表達方式舉例『如果消費滿 100元,就可以打 9 折』,則其 if 的敘述大概會像這樣:
if( spent >= 100)
    spent = spent * 0.9

if敘述的描述方式 :

if(條件式){
  如果條件式為 TRUE,就執行此程式
}
假如你的程式區塊只有一行,那麼可以省略 { } 大括弧。
if(條件式)
  如果條件式為 TRUE,就執行此程式

if...else 敘述 :

if...else 會是二擇一的選擇,其敘述方式如下:
if(條件式){
  如果條件式為 TRUE,就執行此程式
}else{
  如果條件式為 FALSE,就執行此程式 
}
一樣的,如果你的程式區塊也是都只有一行,則能省略 { } 大括弧。
假如要判斷客戶是否為會員,如果是則總金額打 8 折,如果不是只能打 9 折:
if(user == member){
  spent = spent * 0.8
}else{
  spent = spent * 0.9
}

大於兩種以上的條件判斷 if...else if...else

當你需要判斷執行的條件大於 2 種以上時,你可以使用 if...else if...else,其敘述如下:
if(條件判斷1){
    如果條件判斷1為 TRUE 時,則執行此區塊的程式
}else if(條件判斷2){
    當條件判斷1不成立時,則會進入到條件判斷2,若條件判斷2為 TRUE 時,則執行此區塊的程式
}else{
    當條件判斷1與2皆不成立時,則執行此區塊的程式
}

if 敘述可以巢狀

if(條件式){
    if(條件式){
        如果條件式為 TRUE,就執行此程式
    }else{
        如果條件式為 FALSE,就執行此程式   
    }
}

小練習 1:

之前的章節我們有提到,除數不可為 0,比方說 9/0 是不合法的,因為除數不可為 0。接下來我們來寫一個 if else 的敘述,讓使用者輸入分子跟分母,判斷分母的數字不可為 0,若為 0 則顯示相關錯誤訊息。( 分子的英文是 Numerator, 分母的英文是 denominator)。
int numerator;
int denominator;
int result;

numerator = denominator = 0;

NSLog(@"Please Enter Your Numerator");
scanf("%i", &numerator);
NSLog(@"Please Enter Your Denominator");
scanf("%i", &denominator);

if(denominator<=0){
    NSLog(@"Error, Denominator can't <= 0");
}else{
    result = numerator/denominator;
    NSLog(@"%i / %i =   %i", numerator, denominator, result);
}
我們來測試看看 30/10 的 NSLog 結果: (為了排版效果我有自己做一些斷行...實際上輸出不會排的這麼剛好)
2014-01-02 20:48:59.236 FractionTest[33634:303] 
Please Enter Your Numerator
30
2014-01-02 20:49:04.669 FractionTest[33634:303] 
Please Enter Your Denominator
10
2014-01-02 20:49:06.150 FractionTest[33634:303]
30 / 10 =   3
Program ended with exit code: 0
接著我們再來測試指定 0 給 Denominator,驗證是否會進入到 if(denominator<=0) 的程式區塊:
2014-01-02 20:53:32.120 FractionTest[33658:303]
Please Enter Your Numerator
30
2014-01-02 20:53:33.700 FractionTest[33658:303]
Please Enter Your Denominator
0
2014-01-02 20:53:34.637 FractionTest[33658:303]
Error, Denominator can't <= 0
Program ended with exit code: 0

介紹 scanf( )輸入函式

在上面的範例我們使用到了 scanf 這個輸入函式,也就是你透過鍵盤,輸入值給電腦(上面的例子是使用 scanf 讓你分別輸入 Numerator 以及 Denominator 的值 ),並且可以將輸入的值存到某個變數的記憶體空間。 scanf 的表達方式為 :
scanf(“格式化輸入內容”, &參數1, &參數2, ...&參數n);
  • 其『格式化輸入內容』,通常僅含相對應的參數的列印格式:$i, %d, %c, %f ... 等。
  • 『&參數』代表著對應格式的變數記憶體位置。
比方說,我們宣告兩個變數,分別是身高跟體重,其值必須讓使用者自己輸入:
int weight;
int height;
NSLog(@"Please enter weight and height");
scanf("%i%i", &weight, &height);
NSLog(@"weight is %i, height is %i",weight, height);
 其第一個輸入的數字就會儲存到 weight 變數的記憶體位置(&weight),而第二次輸入的數字會儲存到 height 的記憶體位置(&height),兩個變數的輸入格式都是 %i。

介紹 BOOL 布林形態

  • 在 Objective-C 中, bool 形態的值的表示方式,不是 true 就是 false,不是 Yes 就是 No,常常會以數字表示, 0 表示 false, 1 表示 true。在 if 的判斷敘述中,之前提到只要 if 的條件式為 TRUE,即代表滿足條件。因此當條件式的結果不為 0(false),都會被當成是滿足條件。
有些時候你可能會遇到 if 的條件式沒有關係運算子(>=, >, < ...),這是正常的現象,因為條件式只要非 0 ,都會被當成 true。
例子1:
猜猜看這段程式哪一個 if 敘述會被執行:
int test_1 = 0;
int test_2 = 1;
if(test_1){
    NSLog(@"test_1 is true");
}
if(test_2){
    NSLog(@"test_2 is true");
}
答案是第二個,因為 test_2 的值為 1,1 所代表的 bool 形態是 true,因此以滿足執行條件。
例子2:
例子2 我們直接宣告一個 Bool 形態的變數 isHot,以及整數形態的度數。 if 敘述用來判斷 degree 是否超過 32 度,若超過則 isHot 為 Yes,否則為 No。最後再判斷 isHot 的布林值,若布林值為 1 或 Yes 或 TRUE 則都等於成立(非 0 即成立)。你也可以試試看把 isHot = Yes 或 NO 替換成 TRUE 或 FALSE 或是 1 或 0 其結果都相同。
BOOL isHot;
int degree = 36;
if(degree >=32){
    isHot = YES;
}else{
    isHot = NO;
}

if(isHot){
    NSLog(@"Weather is hot!");
}

(2) switch 敘述

switch 敘述類似 if...else if...else,其敘述語法如下:
switch(條件式 expression){
    case "1":
        如果條件式結果是 1,則執行此區塊程式碼。
        break;
    case "2":
        如果條件式結果是 2,則執行此區塊程式碼。
        break;
    case "3":
    case "4":
        如果條件式結果是 3 或 4,則執行此區塊程式碼。
        break;
    default:
    如果上述的條件都沒有符合,則執行此區塊程式碼。
}
  • 當條件式滿足 1 時,就會進入到 case "1" 的程式敘述裡面,若條件式不為 1,則往後面的 case 繼續尋找,直到尋到符合 case 值的條件式,假如都沒有找到符合的 case,則會進入到 default,default 是一種特別的 case,當沒有 case 的值滿足條件式的值時才會執行 default 的程式,。
  • 每個 case 後面一定要加 break 敘述,否則程式就不會中斷,會一直往下執行 (default 可有可無),break 是用來立即離開 switch 敘述,比方說當條件式等於 1 時,就已經滿足 case "1",執行 case "1" 內的程式,遇到 break 之後就不會再往後面的 case 執行。
  • 可以多個 case 共用一樣的程式敘述,比方說
    case "3":
    case "4":
        如果條件式結果是 3 或 4,則執行此區塊程式碼。
        break;
    
    就是條件式滿足3 或是 滿足4 都會執行一樣的程式。

(3) 三元運算子

三元運算子其實也是 if...else,只是其敘述的方式比較特別,敘述方式為:
條件式 ? 程式敘述1 : 程式敘述2
三元運算子的執行判斷為: 如果條件式等於 TRUE,則執行程式敘述1,否則就執行程式敘述2。 其實這種表達方式就跟下面這段 if...else 相同。
if(條件式){
    程式敘述1;
}else{
    程式敘述2;
}

例子1:

用來判斷數學成績是否及格,顯示不同的 NSLog 字串:
int math_score = 57;
math_score < 60 ? NSLog(@"you fail") : NSLog(@"you pass!");
假如成績低於 60 分,則會顯示 you fail 字串,反之若是及格,則會顯示 you pass!。
更浮雜一點的,可以做到巢狀的判斷。假如數學成績超過 60 分,則會進入另一個三元運算子,也就是另一段 if...else 的判斷,假如成績又大於 90,則顯示 Excellent!,低於 90 則顯示 you pass!。
int math_score = 99;
math_score < 60 ? NSLog(@"you fail") : 
     ( math_score>90 ? NSLog(@"Excellent!") : NSLog(@"you pass!") );

例子2:

這個例子用來比較兩個數值誰比較大,較大的值則會指派給變數 max_value:
int value_a = 20;
int value_b = 40;

int max_value = value_a >= value_b ? value_a: value_b;
NSLog(@"max_value is %i", max_value);

下一章節,將會介紹 Objective-C 類別 。

從類別開始,將會進入物件導向的程式基礎。

Ch05 - 介紹 Objective-C 迴圈

Objective-C 程式設計學習筆記 Ch05

  • Ch05-介紹 Objective-C 迴圈。
  • 本章會介紹 for, while 以及 do 這三種迴圈的程式敘述。
  • 介紹關係運算子 ( 如 >=, ==...), 介紹遞增,遞減運算子。
迴圈可以幫助我們以一些確定的規則,進行重複的程式碼,以利達到我們所預期的效果。這是一個蠻常用到的技巧。只要你能描述規則,迴圈可以幫你省下很多程式碼。以下會儘量用淺顯易懂的舉例,讓你體會迴圈的方便之處。

目錄:

  • (1) for 敘述
  • (2) while 敘述
  • (3) do...while 敘述
  • (4) break
  • (5) continue

(1) for 敘述

假如我們想要計算 1 + 2 + 3 + 4 + 5 的總和,你會怎麼做呢? 比較方便的方法是直接使用 NSLog 並把算式寫在參數中 :
NSLog(@"1 + 2 + 3 + 4 + 5 = %i", 1+2+3+4+5); 
如願,我們真的會得到正確的結果,也就是 15。
但是,假如今天是 1 加到 100 呢? 雖然我們真的有辦法手動用鍵盤輸入 1~100 的相加,但是這並不是長久之計,假如今天變成了要計算讓使用者輸入起始值到 100 的總和,我們就無法預測使用者想要從多少開始,這時候我們來看看如何使用 for 敘述,做到從 1 加到 100,並且把最後的總和印出。
我們先來看一下 for 敘述的規則:
for(運算初始式; 條件式; 更新運算式){
  程式碼敘述
}
假如你的程式碼敘述只有一行,你可以省略大括號:
for(運算初始式; 條件式; 更新運算式)
  程式碼敘述
接著我們來看看如何做到 1~100 的總和:
int total;
for(int a = 1 ; a<=100 ; a=a+1){
   total = total + a;
}
NSLog(@"1+2+3+..100 = %i", total);
實作結果:
2013-12-29 ~[19854:303] 1+2+3+..100 = 5050
我們來看看這段 for 迴圈如何做到 1~100 累加的結果,首先我們宣告一了 total 變數,型別是 int,接著開始一段 for 迴圈的敘述,我們在運算初始式宣告一個變數 a ,a 的初始值是 1,接著我們在 for 迴圈的條件式設定這個迴圈的條件式 a<=100,也就是說,當 a<= 100 這個條件成立的時候,才會執行 for 迴圈裡面的程式碼,接著是更新運算式,每一次迴圈執行時都把 a 的值加 1,注意!更新運算式是當每次 for 迴圈執行完才會執行。
而 total 的值會在迴圈每執行一次的時候更新,因此只要迴圈執行條件 (當 a<=100 ) 成立,都會更新 total 的值 total = total + a;,你可以透過在 for 迴圈的程式敘述 NSLog 出 a 的值,觀察 a 值的變化:
NSLog(@"1 + 2 + 3 + 4 + 5 = %i", 1+2+3+4+5);
int total;
for(int a = 1 ; a<=100 ; a=a+1){
   total = total + a;
   NSLog(@"a =  %i", a);        
}
NSLog(@"1+2+3+..100 = %i", total);

區域變數的概念

在上面的例子,我們在 for 迴圈的初始運算式才宣告 for(int a=1;...) 由於我們是在 for 迴圈的敘述裡面才宣告這個變數,因此只有 for 迴圈裡面才存取的到 a 這個變數的值,因此 a 變數是一個區域變數,只有在宣告變數 a 的區域才有辦法存取。
你也可以把變數 a 的宣告放到外面使之變成全域變數 (任何地方都可以存取),也不會影響程式執行:
int a, total;
for( a = 1 ; a<=100 ; a=a+1){
   total = total + a;
}
NSLog(@"1+2+3+..100 = %i", total);
不過由於變數 a 在這個例子中除了 for 迴圈之外沒有其他地方需要用到,因此建議將變數 a 的宣告放在 for 迴圈的初始運算式,讓它成為區域變數使用即可。

比較運算子

我們在條件式設定 a<=100,<= 是一種條件運算子(也有書本寫關係運算子),比較運算子用來比較兩個運算的結果是否為 TRUE 或 FALSE,其運算的結果會是布林值,常見的比較算子如下:
運算子名稱範例
==等於a == b
!=不等於3!= 4
<小於4 < 5
<-小於等於4 <= 5
>大於a > b
>=大於等於a >= b
比較運算子常常出現在需要條件判斷的地方,我們在下一章節的流程 (條件) 控制會經常使用到。

遞增,遞減運算子

我們在 for 迴圈的更新運算式寫道 a=a+1,意思是每次迴圈執行完後,a 的值遞增 1,而這種每次加 1 或是每次減 1 ,有一種運算子可以表達,那就是遞增,遞減運算子。
a = a+1 也可以表示成 a++
a = a-1 也可以表示成 a--
這只是一種表達方式,可能一開始會不太習慣,但是使用久了會發現它很方便。
來個遞減運算子的範例:
int a;
for( a = 100 ; a>=1 ; a--){
   NSLog(@"a is %i", a);
}
執行這個範例,我們把 a 的初始值設定為 100 , 只要 a 滿足 a>=1 這個條件時,將會執行裡面的程式碼,接著 a-- ,將 a 的值地減 1 ,一直不斷的重複直到 a 不滿足 a>=1 這個條件時。
你看看 NSLog 的 a 值是否從 100 遞減至 1 。
舉例一些常見的運算式: (以下表格代表左邊的運算是相當於右邊的運算式)
運算式基本運算式
a++a = a + 1
a--a = a - 1
a += ba = a + b
a -= ba = a - b
a*=a = a * b
a/=a = a / b
a%=a = a % b

一個以上的運算初始值

for 迴圈的運算初始值,可以讓你定義一個以上的運算初始值,但多的運算是必須使用 ,隔開。
以下的範例是,同時有兩個初始值,分別是 a 跟 b (用,隔開),當 a <= 100 時, 更新運算子為 a 遞增 1,而 b 遞減 1 (一樣用,隔開):
int a,b;
for( a = 1, b=50 ; a<=100 ; a++, b--){
   //your code
}

for 迴圈可以巢狀

所謂巢狀就是一個 for 迴圈裡面還可以在包另一個 for 迴圈。
for( 運算初始式; 條件式; 更新運算式 ){
 //your code
 for( 運算初始式; 條件式; 更新運算式 ){
   //your code       
 }
}

(2) while 敘述

while 的敘述為:
while (條件式){
 程式碼;
}
比起 for 的敘述, while 可能相對單純一點。while 的敘述若以中文的說法,就是當條件成立,就執行裡面的程式碼,比方說當 a <=5 時,印出 a 的值:
int a = 1;
while(a<=5){
   NSLog(@"a's value: %i", a);
   a++;
}
執行結果:
a's value: 1
a's value: 2
a's value: 3
a's value: 4
a's value: 5
需要注意的是一定要在 while 的程式碼加上 a++; 讓 a 每次遞增 1,這樣第五次進到 while 程式時,a 就會等於 6,於是才會停止繼續執行 while 的程式碼了,若少加了這行,則會變成無窮迴圈,因為 a 的值沒有改變,永遠等於 1,而且也永遠符合 while 的條件式 (a<=5),使用 while 的話一定要注意這一點,別讓它成為無窮迴圈。

(3) do...while 敘述

do...while 的敘述如下:
do {
  程式碼
} while (條件式);
do...while 敘述跟 while 很類似,其實就是把順序倒過來而已,使用 while 的時候,會先判斷是不是符合條件式在執行程式碼,而 do...while 是先執行程式碼,在判斷 while 裡面的條件式是不是成立。
我們用 do...while 做一個 1 累加到 10 的結果:
int a = 1;
int total = 0;        
do{
   total += a++;
  }while (a<=10);
NSLog(@"1+2+3...+10 =  %i", total);
執行結果:
1+2+3...+10 =  55

(4) break 敘述

break 用在當某個條件成立時,離開迴圈的執行。以下範例是 a=1, a<=10,a 每次遞增 1,但是 for 迴圈裡面多一個條件判斷 (if 敘述在下章介紹),我們利用 if 條件式,判斷當 a 等於 5 時,就使用 break 離開迴圈。
int a = 1;
int total = 0;
for( a = 1 ; a <= 10 ; a++){
   total +=a;
   NSLog(@"a is %i", a);
   NSLog(@"total is %i", total);
   //當 a 等於 5 時,即中斷 for 迴圈
   if(a==5){
      break;
   }
}
執行結果:
2013-12-30 ~[20695:303] a is 1
2013-12-30 ~[20695:303] total is 1
2013-12-30 ~[20695:303] a is 2
2013-12-30 ~[20695:303] total is 3
2013-12-30 ~[20695:303] a is 3
2013-12-30 ~[20695:303] total is 6
2013-12-30 ~[20695:303] a is 4
2013-12-30 ~[20695:303] total is 10
2013-12-30 ~[20695:303] a is 5
2013-12-30 ~[20695:303] total is 15
當 a 等於 5 時,就沒有在執行 for 裡面的程式了,因為已經被 break 了。 下個章節會在詳加介紹 break 敘述。

(5) continue 敘述

continue 的作用是立即跳出,不會再執行下面的程式碼,回到迴圈開頭重新執行。
下方的範例,a每次遞增 1,而條件是 a <= 5 時才會執行,我們利用 continue 的特性跟 if 敘述,故意跳開當 a=2 以及 a=4 時不要往下執行 NSLog 函式。最後只會印出 1, 3, 5 這三種 a 的值。
int a = 1;

for( a = 1 ; a <= 5 ; a++){
  if(a==2 || a==4){
    continue;
  }
  NSLog(@"a is %i", a);
}
執行結果:
2013-12-30 ~[20736:303] a is 1
2013-12-30 ~[20736:303] a is 3
2013-12-30 ~[20736:303] a is 5

下一章節,將會介紹 Objective-C 流程控制 。

Ch04 - 介紹 Objective-C 的運算式以及一些運算子

Objective-C 程式設計學習筆記 Ch04

  • Ch04-介紹 Objective-C 的運算式以及一些運算子。
  • 本章會介紹的運算式就是基本的四則運算,也就是加『+』,減『-』,乘『*』,除『/』的四種組合,另外也會提到模數運算子(Modules Operator)『%』(講白話一點 % 就是取得餘數)。
  • 關於運算子在這個章節僅會介紹部分,有些運算子會在後面的章節,依照主題的相關性會順便介紹。

目錄:

  • (1) 指定運算子
  • (2) 加減乘除的順序 (優先權)
  • (3) 單元負號運算子
  • (4) 模數運算子(%)
  • (5) 型別轉換運算子

(1) 指定運算子

若要說到運算子,最基本的大概就是指定運算子(Assignment operator)了,在我們學習怎麼宣告一個變數時,就已經學會指定運算子了,int a = 1;,就是將 = 等號右邊的值,指定給 a 這個變數。
指定運算子也可以跟一般算術運算子結合使用,比方說 int a = 1+1; 是合法的指定值的方式。 指定運算子除了跟基本的 +, - , *, /, % 結合,其變數的值也可以使用位移的方式表達,比方說 a = a + 1 相當於 a++ 也相當於 a+=1,而這種寫法,會在下一章節,迴圈的部分會很常遇到,務必熟悉。
範例:
int a = 1+1;

int b =1;
b+=1;

int c= 1;
c++;

NSLog(@"a is %i", a);
NSLog(@"b is %i", b);
NSLog(@"c is %i", c);
其結果都為 2:
2013-12-28 ~[16887:303] a is 2
2013-12-28 ~[16887:303] b is 2
2013-12-28 ~[16887:303] c is 2

(2) 加減乘除的順序 (優先權)

  • 在我們小時候就已經學過了,所謂的『先乘除,後加減』,其實這就一種算式的優先權。以下是幾個關於加減乘除的運算優先權的整理:
優先程度符號
高度優先-(負號)
中度優先*(乘), /(除), %(餘)
低度優先+(加), -(減)
1.『*』, 『/』, 『%』優先於『+』, 『-』
2. 可以運用 ( ) 更清楚的表達運算的順序,若 ( ) 有巢狀,
   則是越內部的 ( ) 先執行運算。(簡而言之就是 () 可以影響優先順序) 
3. 如果整行運算式都同樣的優先權,是由左至右計算。

範例 1: 簡單的比較

NSLog(@"1 + 2 * 2 = %i", 1 + 2 * 2);
NSLog(@"(1 + 2) * 2 = %i", (1 + 2) * 2);
NSLog(@"1 + (2 * 2) = %i", 1 + (2 * 2));
執行結果:
2013-12-28 ~[16247:303] 1 + 2 * 2 = 5
2013-12-28 ~[16247:303] (1 + 2) * 2 = 6
2013-12-28 ~[16247:303] 1 + (2 * 2) = 5
  • 第一行運算子跟第三行是一樣的意思,即便第一行的 2*2 沒有被 ( ) 包覆,但因為是先乘除後加減,因此也是先運算 2*2,然後再加上前面的 1, 最後得 5。
  • 第二行運算子,則是先運算 ( ) 內的結果,(1+2) 得 3 之後再 * 2,因此會得 6 。

範例 2: 除數可以是 0 嗎?

NSLog(@" 9 / 3 = %i", 9/3);
NSLog(@" 9 / 0 = %i", 9/0);
執行結果:
2013-12-28 ~[16290:303]  9 / 3 = 3
2013-12-28 ~[16290:303]  9 / 0 = 8400912
  • 第一行運算式, 9/3 得 3 沒有問題,但是第二行運算式,卻有一點狀況,一般我們如果在計算機按下 9/0 會得到不正確的結果,這是正常的,因為在程式語言中,把除數指定為 0,都會是不正常的結果或是錯誤,因此我們在後面的章節會學到,當除數為 0 的時候,則顯示錯誤或是一些提示訊息,而不要顯示不正常的結果。
  • 在 Xcode 將除數設定為0時的警告: 在 Xcode 將除數設定為0時的警告
  • 使用 google 計算機將除數設定為0時的警告: 使用 google 計算機將除數設定為0時的警告

範例 3: 小心型別呀!

int a = 5;
int b = 2;
NSLog(@"a / b = %i", a/b);
執行結果:
2013-12-28 ~[16447:303] a / b = 2
  • 以這個例子來說,大家或許會納悶,5 / 2 不是 2.5 嗎? 要注意的是,我們在 NSLog 的輸出格式字串是 %i , %i 是用來輸出整數的,因此計算的結果會是整數。
  • 但是呢,或想要取得 2.5 這種浮點數格式的結果,千千萬萬不能直接使用 NSLog(@"a / b = %f", a/b);,在這裡我們不能直接將 %i 替換成 %f ,這是行不通的,因為變數 a 跟 b 本身的型別都是 int,你必須將 int 的型別轉成 float,才有辦法輸出成小數點的格式。
    int a = 5;
    int b = 2;
    float  f1, f2;
    f1 = a;
    f2 = b;
    NSLog(@"a / b = %f", f1/f2);
    
    結果:
    2013-12-28 ~[16509:303] a / b = 2.500000
    
    或是將其中一個 int 轉換成 float 也可以,以下是將 a 轉換成 float:
    int a = 5;
    int b = 2;
    float  f1;
    f1 = a;
    NSLog(@"a / b = %f", f1/b); 
    

  • 將整數指定給浮點數的型別,是可以正確的轉換。
  • 如果將浮點數轉換給整數,則小數點的部分將會被捨去。
  • 上面轉型別的範例,其實是將 int 的變數指定給一個 float 型別的變數,這只是一種型別轉換的方式,後面會在介紹如何轉換型別。

(3) 單元負號運算子

  • 單元負號運算子(unady minus operator),就是將某個變數給予 - 號,使其變成負數。
  • 以下的例子即是將 5 變成 -5。
    int a = 5;
    NSLog(@"-a = %i", -a);
    
  • 要注意的事情是,單元負號運算子,只是在運算過程中將某變數轉換成負數,使其達到預期的計算結果,_並不是永久轉換_。

(4) 模數運算子(%)

  • 模數運算子的運算結果會是取得兩個數字相除之後的餘數。
    NSLog(@"3 %% 2 = %i", 3%2);
    
    3 / 2 = 1 ...1,餘樹為 1。所以得到的結果為:
    2013-12-28 ~[16618:303] 3 % 2 = 1
    
    在 NSLog 的輸出字串格式中,必須使用 %% 代表 一個 % 符號。因為之前有提到輸出字串格式會依照 % 之後的字元,決定要輸出什麼樣的值,因此若要輸出一個 % ,就是要再帶上一個 %。

(5) 型別轉換運算子

  • 我們可以利用 ( ) 小括號,將一個變數做型別的轉換。
  • 小括號 ( ) 裡面要寫的是要被轉換的型別,比方說 (float) 或是 (int),這就是『型別轉換運算子』。
  • 要注意的事情是,型別轉換運算子,只是在運算過程中將某變數轉換型別,使其達到預期的計算結果,_並不是永久轉換_。
  • 型別轉換運算子的優先權大於一般的算術運算子,但與負號運算子相同優先權。
  • 以下範例是將浮點數轉成整數:
    NSLog(@"Result is %i", (int)2.5 + (int)2.5);
    
    結果為:
    2013-12-28 ~[16702:303] Result is 4
    
  • 以下範例是直接將計算結果轉換成 float:
    NSLog(@"Result is %f", (float)10/3);
    
    結果為:
    2013-12-28 ~[16775:303] Result is 3.333333
    

下一章節,將會介紹 Objective-C 迴圈 。

參考資料