Objective C的算術表示式

2021-09-06 06:44:13 字數 3446 閱讀 1443

在objective-c中,事實上與所有的程式語言一樣,在兩個數相加時使用加號(+),在兩個數相減時使用減號(-),在兩個數相乘時使用乘號(*),在兩個數相除時使用除號(/)。這些運算子稱為二元算術運算子,因為它們運算兩個值或項。

你已經看到如何在objective-c中執行簡單的運算,例如,加法。下面的程式進一步說明了減法、乘法和除法運算。在程式中執行的最後兩個運算引入了乙個概念,即乙個運算子比另乙個運算子有更高的優先順序。事實上,objective-c中的每乙個運算子都有與之相關的優先順序。

優先順序用於確定包含多個運算子的表示式如何求值:優先順序較高的運算子首先求值。如果表示式包含優先順序相同的運算子,可按照從左到右或從右到左的方向來求值,具體按哪個方向求值取決於運算子。這就是通常所說的運算子結合性。

**清單4-2

//說明各種算術運算子的用法

#import

int main (int argc, char *argv)

return 0;

}

**清單4-2 輸出

a - b = 98

b * c = 50

a / c = 4

a + b * c = 150

a * b + c * d = 300

在宣告整型變數a、b、c、d及result之後,程式將a減b的結果指派給result,然後用恰當的nslog呼叫來顯示它的值。

下一條語句

result = b * c;

將b的值和c的值相乘並將其結果儲存到result中。然後用nslog呼叫來顯示這個乘法的結果。到目前為止,你應該很熟悉該過程了。

之後的程式語句引入了除法運算子——斜槓(/)。100除以25得到4,可用nslog語句在a除以c之後立即顯示。

在某些計算機系統中,嘗試用乙個整數除以0將導致程式異常終止或出現異常。即使程式沒有異常終止,執行這樣的除法所得的結果也毫無意義。在第6章「選擇結構」中,將看到如何在執行除法運算之前檢驗除數是否為0。如果除數為0,可採用適當的操作來避免除法運算。

表示式a + b * c

不會產生結果2550(即102×25);相反,相應的nslog語句顯示的結果為150。這是因為objective-c與其他大多數程式語言一樣,對於表示式中多重運算或項的順序有自己的規則。通常情況下,表示式的計算按從左到右的順序執行。然而,為乘法和除法運算指定的優先順序比加法和減法的優先順序要高。因此,objective-c認為表示式

a + b * c

等價於a + (b * c)

(如果採用基本的代數規則,那麼該表示式的計算方式是相同的。)

如果要改變表示式中項的計算順序,可使用圓括號。事實上,前面列出的表示式是相當合法的objective-c表示式。這樣,可用表示式

result = a + (b * c);

替換**清單4-2中的表示式,也可以獲得同樣的結果。然而,如果用表示式

result = (a + b) * c;

來替換,則賦給result的值將是2550,因為要首先將a的值(100)和b的值(2)相加,然後將結果與c的值(25)相乘。圓括號也可以巢狀,在這種情況下,表示式的計算要從最裡面的一對圓括號依次向外進行。只要確保結束圓括號和開始圓括號的數目相等即可。

從**清單4-2中的最後一條語句可發現,對nslog指定表示式作為引數時,無須將該表示式的結果先指派給乙個變數,這種做法是完全合法的。表示式

a * b + c * d

可根據以上述規則,按照

(a * b) + (c * d)

即(100 * 2) + (25 * 4)

來計算。

求出的結果300將傳遞給nslog函式。

**清單4-3鞏固了前面討論的內容,並引入了整數運算的概念。

**清單4-3

//更多的算術表示式

#import

int main (int argc, char *argv)

return 0;

}

**清單4-3 輸出

6 + a / 5 * b = 16

a / b * b = 24

c / d * d = 25.000000

-a = -25

前3條語句中,在int和a、b及result的宣告之間插入了額外的空格,以便對齊每個變數的宣告,使用這種方法書寫語句可使程式更容易閱讀。還可以注意到,在迄今出現的每個程式中,每個運算子前後都有空格。這種做法同樣不是必需的,僅僅是出於美觀上的考慮。一般來說,在允許單個空格的任何位置都可以插入額外的空格。如果能使程式更容易閱讀,輸入空格鍵的操作還是值得做的。

在**清單4-3中,第乙個nslog呼叫中的表示式鞏固了運算子優先順序的概念。該表示式的計算按以下順序執行:

(1)因為除法的優先順序比加法高,所以先將a的值(25)除以5。該運算將給出中間結果5。

(2)因為乘法的優先順序也高於加法,所以隨後中間結果(5)將乘以2(即b的值),並獲得新的中間結果(10)。

(3)最後計算6加10,並得出最終結果(16)。

第二條nslog語句引入了一種新誤解。你希望a除以b,再乘以b的操作返回a(已經設定為25)。但此操作並不會產生這一結果,在輸出顯示器上顯示的是24。難道計算機在某個地方迷失了方向?如果這樣就太不幸了。其實該問題的實際情況是,這個表示式是採用整數運算來求值的。

如果回頭看一下變數a和b的宣告,你會想起它們都是作為int型別宣告的。當包含兩個整數的表示式求值時,objective-c系統都將使用整數運算來執行這個操作。在這種情況下,數字的所有小數部分將丟失。因此,計算a除以b,即25除以2時,得到的中間結果是12,而不是期望的12.5。這個中間結果乘以2,就得到最終結果24。這樣,就解釋了出現「丟失」數字的情況。

在**清單4-3的倒數第二個nslog語句中看到,如果用浮點值代替整數來執行同樣的運算,就會獲得期望的結果。

決定使用float變數還是int變數應該基於變數的使用目的。如果無須使用任何小數字,就可以使用整型變數。這將使程式更加高效,換言之,它可以在大多數計算機上更快速地執行。另一方面,如果需要精確到小數字,那就很清楚應該選擇什麼。此時,唯一需要回答的問題是使用float還是double。對此問題的回答取決於使用資料所需的精度以及它們的量級。

在最後一條nslog語句中,使用了一元負號運算子對變數a的值取負。這個一元運算子是用於單個值的運算子,而二元運算子作用於兩個值。負號實際上扮演了乙個雙重角色;作為二元運算子,它執行兩個數相減的操作;作為一元(或單目)運算子,它對乙個值取負。

與其他算術運算子相比,一元負號運算子具有更高的優先順序,但一元正號運算子(+)除外,一元正號運算子和算術運算子的優先順序相同。因此,表示式

c = -a * b;

將執行-a乘以b。

本文節選自《objective-c程式設計(第4版)》

電子工業出版社出版

[美]stephen g. kochan(史蒂芬·g·科昌)著

林冀範俊朱奕欣譯

Objective c 中的算術函式和常數的表示

常數名 說明m pi 圓周率 m pi 2 圓周率的 2 m pi 4 圓周率的 4 m 1 pi 1 m 2 pi 2 m e e m log2e log 2 e m log10e log 10 e 函式名說明 int rand 隨機數生成。例 srand time nil 隨機數初期化 int ...

算術表示式

引用標頭檔案 include include include using namespace std typedef int elemtype const int stack init size 100 儲存空間的初始化分配量 const int stackincrement 10 儲存空間分配增量...

算術表示式

include include include include define maxzhansize 30 char stack maxzhansize char deleted int top void add int top,char item 逆波蘭數計算 define element int...