嵌套 MAX 导致在使用各种 object 类型时有时会返回最小值 - MAX(a,MAX(b,c))

Nested MAX causes smallest value to sometimes be returned when using various object types - MAX(a,MAX(b,c))

我调试了一段时间才发现我定义为 MAX(2,x) 的整数之一返回 -4,即使 2 明显大于 -4。

这是我的代码的简化版本 运行 因此您可以亲身体验不规则性。

    NSLog(@"a) %i", (int)MAX(2,-4));
    NSString *aString = @"90586381095716439405631195482586763570805293418319186736659080000000000000";
    int aNumber = (int)MAX(2,10-MAX(1,(aString.length/5)));
    NSLog(@"b) %i", aNumber);
    NSLog(@"c) %i", (int)MAX(2,10-MAX(1,16)));

a) 将按预期记录 2。

b) 将记录 -4,这对我来说毫无意义。

c) 将按预期记录 2(现在 b 对我来说意义更小了)


我没有得到什么? MAX 在 xCode 中是棕色的,这让我觉得它在 UIKit 或 Math 库中的某个地方被设置为 CLANG,如果是这样的话,也许内部 MAX 仅在第一个 MAX 被处理后才被处理,因此嵌套 MAX 会导致奇怪错误。但如果是这样的话,c) 是否也记录了 -4?

我没有使用Objective-C,但字符串的length可能是一个无符号值。如果它的工作方式与普通 C 相同,那将导致内部 MAX 的结果也无符号,因此从 10 减去将作为无符号执行。这将导致该值下溢并导致一个非常大的值,例如假设 32 位整数的 4294967292,因此它将被外部 MAX.

选择

最后的 int 是然后将其转换回带符号的,最终得到负值。如果你的编译器是好的并且你把 (int) 排除在外,你应该得到一个关于它的警告。

故事的寓意,不要使用无关的转换,这会导致编译器不给你有价值的警告。