4.2 算术表达式

在Objective-C中,事实上与所有程序设计语言一样,在两个数相加时使用加号(+),在两个数相减时使用减号(-),在两个数相乘时使用乘号(*),在两个数相除时使用除号(/)。这些运算符称为二元算术运算符,因为它们运算两个值或项。

4.2.1 运算符的优先级

你已经看到如何在Objective-C中执行简单运算,例如加法。下面的程序进一步说明了减法、乘法和除法运算。在程序中执行的最后两个运算引入了一个运算符比另一个运算符有更高优先级或优先级的概念。事实上,Objective-C中的每一个运算符都有与之相关的优先级。

该优先级用于确定拥有多个运算符的表达式如何求值:优先级较高的运算符首先求值。如果表达式包含优先级相同的运算符,可按照从左到右或从右到左的方向来求值,具体按哪个方向求值取决于运算符。这就是通常所说的运算符结合性。附录B提供了有关运算符优先级及其结合规则的完整列表。

代码清单4-2


//Illustrate the use of various arithmetic operators

import<Foundation/Foundation.h>

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

int a=100;

int b=2;

int c=25;

int d=4;

int result;

result=a-b;//subtraction

NSLog(@“a-b=%i”,result);

result=b*c;//multiplication

NSLog(@“b*c=%i”,result);

result=a/c;//division

NSLog(@“a/c=%i”,result);

result=a+b*c;//precedence

NSLog(@“a+b*c=%i”,result);

NSLog(@“ab+cd=%i”,ab+cd);

[pool drain];

return 0;

}


代码清单4-2输出


a-b=98

b*c=50

a/c=4

a+b*c=150

ab+cd=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指定表达式作为参数时,无需将该表达式的结果先指派给一个变量,这种做法是完全合法的。表达式


ab+cd


可根据以上述规则使用


(ab)+(cd)



(1002)+(254)


来计算。

求出的结果300将传递给NSLog例程。