嵌套 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)
排除在外,你应该得到一个关于它的警告。
故事的寓意,不要使用无关的转换,这会导致编译器不给你有价值的警告。
我调试了一段时间才发现我定义为 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)
排除在外,你应该得到一个关于它的警告。
故事的寓意,不要使用无关的转换,这会导致编译器不给你有价值的警告。