在Obj-C中按定义的常数除法不起作用

时间:2013-03-07 16:42:37

标签: objective-c c-preprocessor modulo nsrange

如果我写

#define ANOTHER_CONSTANT 200
#define MYDIVISOR 1000/ANOTHER_CONSTANT

然后是方法

- (void)result {
    NSRange range = [@"--BB-------A----" rangeOfString:@"A" options:NSBackwardsSearch];
    int rest = range.location % MYDIVISOR;
    NSLog(@"Rest is %i", rest);
}

无论A出现在何处,输出总是休息为0。我已经通过将MYDIVISOR存储到一个中间整数变量来解决它,但我想知道为什么它不适用于预定义的常量。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

这是因为你没有在MYDIVISOR定义附近加上括号:

#define MYDIVISOR (1000/ANOTHER_CONSTANT)

没有括号,在预处理器替换之后代码将如下所示:

int rest = range.location % 1000 / ANOTHER_CONSTANT;

因为%/具有相同的优先级并且从左到右应用,所以编译器会生成代码,该代码通过1000获得除法的余数,然后快速将结果除以200,这肯定不是你所期望的。

一般来说,总是在整个宏周围加上括号是个好主意。对于带参数的类函数宏,也可以将每个参数括起来。