Objective C MAX宏bug

Ada*_*ume 9 macros objective-c

我在Objective C中看到MAX宏的奇怪行为.具体来说,我在我的main函数中有这个代码:

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));
Run Code Online (Sandbox Code Playgroud)

输出是:

[array count] - 1 = -1
MAX(0, [array count] - 1) = -1
MAX(0, -1) = 0
Run Code Online (Sandbox Code Playgroud)

我用-save-temps保存了预处理器输出,它看起来像这样:

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)));
Run Code Online (Sandbox Code Playgroud)

所有必要的括号都在那里,并且[array count] - 1没有副作用,因此通常的宏观问题不应该适用.知道发生了什么事吗?

Mik*_*rty 23

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

但是当你接受0xFFFFFFFF并将其作为参数传递给它时NSLog(@"%d"),NSLog会将其视为有符号整数(因为你使用了%d).