【问题标题】:2048 casted to BOOL returns 02048 转换为 BOOL 返回 0
【发布时间】:2014-07-01 02:48:56
【问题描述】:

考虑这段代码

NSInteger q = 2048;
BOOL boolQ = q;

NSLog(@"%hhd",boolQ);

执行后 boolQ 等于 0。有人可以解释为什么会这样吗?

【问题讨论】:

标签: ios objective-c c boolean


【解决方案1】:

将整数值转换为太小而无法表示正在转换的值的类型是 C(C11 标准附件 J.2)中未定义的行为,因此在处理 C 级问题的 Objective-C 部分也是如此。由于它是未定义的行为,它可以代表任何它想要的结果,无论是否期望值。

根据 6.3.1.4,任何整数都可以作为布尔值使用而无需强制转换,在这种情况下,它将显示预期的行为(0 为 0,其他一切为 1),从而产生到alk建议的!!成语;也许违反直觉,您通过显式转换值来转换值(相反,转换由! 运算符插入的隐式转换操作正确处理)。

【讨论】:

    【解决方案2】:

    BOOL 可能实现为charuint8_t/int8_t,因为"hh" 打印整数一半的一半。这通常是一个字节。

    转换为char 会占用2048 的最低8 位(=0x800)并为您提供0

    将任何整数转换为布尔值的正确方法是:

    NSInteger q = some-value;
    BOOL b = !!q;
    

    【讨论】:

    • 这是有道理的,但如果你调试它,你会看到 BOOL 值实际上是 NO,我添加 NSLog hdd 只是为了打印它。如果您在 NSLog 行上方的断点处停止,您可以检查 boolQ 是否为 NO。
    • 根据这个答案http://stackoverflow.com/a/544250/694576 NO 只是#define(BOOL) 0。 @haawa
    猜你喜欢
    • 2016-10-23
    • 2018-12-14
    • 1970-01-01
    • 2021-11-05
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多