int chance = -5;
int rand = arc4random() % 100; // Number from 0 to 99
if (rand <= chance) { // This will never happen
NSLog(@"This is... NOT POSSIBLE");
}
实际上,这永远不会发生。但是
int chance = -5;
if (arc4random() % 100 <= chance) {
NSLog(@"This is... NOT POSSIBLE");
}
在这里,我没有将它存储在变量中,而是将随机数表达式直接放在了条件中。并且满足条件(有时)。
这是为什么呢?如何调试此行为?
最佳答案
键入促销规则。
arc4random
返回一个unsigned 值。这意味着在您的第二种情况下,-5
被提升为相同的无符号类型,将其转换为 4294967291
。 4+十亿绝对比0-99的任何数字都大!
让我们来看看您的两个示例中发生了什么。
从您的第一个示例开始,在这一行中:
int rand = arc4random() % 100;
arc4random()
返回一个无符号值。那么它看起来像:int rand = someUnsignedNumber % 100;
100
是一个带符号的 int,因此它被提升为与someUnsignedNumber
相同的类型,并应用%
操作。之后你有:int rand = someUnsignedNumberBetween0And99;
将该无符号数分配给
int rand
使其变回有符号数。然后您的比较会按预期进行。在第二个例子中,你有这一行:
if (arc4random() % 100 <= chance)
arc4random() % 100
也会发生同样的事情,产生如下内容:if (someUnsignedNumberBetween0And99 <= chance)
但是在这里,
chance
是一个带符号的数字。它得到提升,如上所述改变它的值,你最终会看到你所看到的奇怪行为。
关于ios - 为什么 arc4random() 在将其存储在变量中时表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120069/