4.2.3 模运算符
本章介绍的最后一个运算符是模运算符,它由百分号(%)表示。通过分析代码清单4-4的输出,尝试确定这种运算符的工作方式。
代码清单4-4
//The modulus operator
import<Foundation/Foundation.h>
int main(int argc, char*argv[])
{
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];
int a=25,b=5,c=10,d=7;
NSLog(@“a%%b=%i”,a%b);
NSLog(@“a%%c=%i”,a%c);
NSLog(@“a%%d=%i”,a%d);
NSLog(@“a/dd+a%%d=%i”,a/dd+a%d);
[pool drain];
return 0;
}
代码清单4-4输出
a%b=0
a%c=5
a%d=4
a/d*d+a%d=25
注意,main中的语句定义并初始化了变量a、b、c和d,这些工作均在一条语句内完成。
你已经知道,NSLog使用百分号之后的字符来确定如何输出下一个参数。然而,如果它后面紧跟另一个百分号,那么NSLog例程认为你其实想显示百分号,并在程序输出的适当位置插入一个百分号。
如果总结出用模运算符%的功能是计算第一个值除以第二个值所得的余数,就是正确的。在第一个例子中,25除以5所得的余数,显示为0。如果用25除以10,会得到余数5,输出中的第二行可以证实。执行25乘以7将得到余数4,它显示在输出的第三行。
现在,我们把注意力转移到最后一条语句求值的表达式上。你将回忆起Objective-C使用整数运算来执行两个整数间的任何运算。因此,两个整数相除所产生的任何余数将被完全丢弃。如果使用表达式a/b表示25除以7,将会得到中间结果3。将这个结果乘以d的值(即7),将会产生中间结果21。最后,加上a除以b的余数,该余数由表达式a%d来表示,会产生最终结果25。这个值与变量a的值相同并非巧合。一般来说,表达式
a/b*b+a%b
的值将始终与a的值相等,当然,这是在假定a和b都是整型值的条件下做出的。事实上,定义的模运算符%只用于处理整数。
就优先级而言,模运算符的优先级与乘法和除法的优先级相等。毫无疑问,这意味着表达式
table+value%TABLE_SIZE
等价于
table+(value%TABLE_SIZE)