如果我写
#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存储到一个中间整数变量来解决它,但我想知道为什么它不适用于预定义的常量。有什么想法吗?
答案 0 :(得分:3)
这是因为你没有在MYDIVISOR
定义附近加上括号:
#define MYDIVISOR (1000/ANOTHER_CONSTANT)
没有括号,在预处理器替换之后代码将如下所示:
int rest = range.location % 1000 / ANOTHER_CONSTANT;
因为%
和/
具有相同的优先级并且从左到右应用,所以编译器会生成代码,该代码通过1000
获得除法的余数,然后快速将结果除以200
,这肯定不是你所期望的。
一般来说,总是在整个宏周围加上括号是个好主意。对于带参数的类函数宏,也可以将每个参数括起来。