我在Objective C中看到MAX宏的奇怪行为.具体来说,我的主要功能有这个代码:
NSArray* array = [NSArray array]; NSLog(@"[array count] - 1 = %d",[array count] - 1); NSLog(@"MAX(0,[array count] - 1) = %d",MAX(0,[array count] - 1)); NSLog(@"MAX(0,-1) = %d",-1));
输出为:
[array count] - 1 = -1 MAX(0,[array count] - 1) = -1 MAX(0,-1) = 0
我用-save-temps保存了预处理器输出,它看起来像这样:
NSArray* array = [NSArray array]; NSLog(@"[array count] - 1 = %d",((0) > ([array count] - 1) ? (0) : ([array count] - 1))); NSLog(@"MAX(0,((0) > (-1) ? (0) : (-1)));
所有必需的括号都在那里,[array count] – 1没有副作用,所以通常的宏问题不应该适用.任何想法发生了什么?
解决方法
[array count]返回一个NSUInteger – 换句话说,返回一个无符号整数.所以[array count] – 1不是-1,它是((NSUInteger)-1),这是0xFFFFFFFF或类似的 – 大于零.
但是,当您将0xFFFFFFFF作为参数传递给NSLog(@“%d”)时,NSLog将其视为有符号整数(因为您使用%d).