代码之家  ›  专栏  ›  技术社区  ›  Adam Crume

目标C最大宏错误

  •  9
  • Adam Crume  · 技术社区  · 14 年前

    我在目标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 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)));
    

    所有必要的括号都在那里,并且 [array count] - 1 没有副作用,所以通常的宏观问题不应该适用。知道怎么回事吗?

    1 回复  |  直到 14 年前
        1
  •  23
  •   Mike Morearty NiCk Newman    14 年前

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

    但是当你把0xffffffff作为参数传递给 NSLog(@"%d") ,nslog将其视为有符号整数(因为您使用了%d)。