2010-09-24 75 views
9

我看到奇怪的行为与目的C的MAX宏具体来说,我有这样的代码在我的主要功能:目标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", MAX(0, -1)); 

输出是:

[array count] - 1 = -1 
MAX(0, [array count] - 1) = -1 
MAX(0, -1) = 0 

我保存-save-临时工预处理器输出,它看起来像这样:

NSArray* array = [NSArray array]; 
NSLog(@"[array count] - 1 = %d", [array count] - 1); 
NSLog(@"MAX(0, [array count] - 1) = %d", ((0) > ([array count] - 1) ? (0) : ([array count] - 1))); 
NSLog(@"MAX(0, -1) = %d", ((0) > (-1) ? (0) : (-1))); 

所有必要的括号是有,并且[array count] - 1没有副作用,所以通常的宏问题不适用。任何想法发生了什么?

回答

23

[array count]返回NSUInteger - 换句话说,一个无符号整数。因此[array count] - 1不是-1,它是((NSUInteger)-1),它是0xFFFFFFFF或类似的东西 - 它大于零。

但是,当你采取0xFFFFFFFF并将其作为参数传递给NSLog(@"%d")时,NSLog将它视为一个有符号整数(因为您使用了%d)。

+0

我没有注意到返回值是无符号的,但它是有道理的。谢谢! – 2010-09-24 01:39:17