0

如果我写

#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 出现在哪里,输出始终是 rest 为 0。我已经通过将 MYDIVISOR 存储到中间整数变量中来解决它,但我想知道为什么它不适用于预定义的常量。有任何想法吗?

4

1 回答 1

3

这是因为您没有在MYDIVISOR定义周围加上括号:

#define MYDIVISOR (1000/ANOTHER_CONSTANT)

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

int rest = range.location % 1000 / ANOTHER_CONSTANT;

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

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

于 2013-03-07T16:44:58.717 回答