【问题标题】:Objective C MAX macro bugObjective C MAX 宏错误
【发布时间】:2011-04-16 13:17:55
【问题描述】:

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

输出是:

[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 没有副作用,所以通常的宏问题不应该适用。知道发生了什么吗?

【问题讨论】:

    标签: objective-c macros


    【解决方案1】:

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

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

    【讨论】:

    • 我没有注意到返回值是无符号的,但它是有道理的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2017-01-05
    相关资源
    最近更新 更多