【问题标题】:Implications of int values not “fitting” – bool or BOOL for Objective-C?int 值不“合适”的含义——Objective-C 的 bool 或 BOOL?
【发布时间】:2012-03-15 01:02:05
【问题描述】:

在这里的 cmets 中 -- https://stackoverflow.com/a/9393138/8047 -- 我发现 BOOL 在从 int 值设置其值时有一些意外行为。大多数情况下,如果该值设置为0x1000,它会被评估为FALSE(令人惊讶)。

NSLog(@"All zero? %d %d", (BOOL)0, (bool)0);
NSLog(@"All one? %d %d %d", (BOOL)4095, (BOOL)4096, (BOOL)4097); // 4096=0x1000 or 8-bits
NSLog(@"All one? %d %d %d", (bool)4095, (bool)4096, (bool)4097);

Produces:
All zero? 0 0
All one? -1 0 1
All one? 1 1 1

我认为这很奇怪,但话又说回来,我不会从 int 转换到 BOOL 。然而:

  1. 这是否意味着bool 比BOOL 更受欢迎?为什么或为什么不?
  2. 可以用吗

if (thatBool) {

    或者应该更喜欢

if (thatBool ? YES : NO) {

  为什么?

注意:这是这个问题的更具体的版本 -- Objective-C : BOOL vs bool -- 但我认为它增加了它并且不是重复的。

【问题讨论】:

    标签: objective-c primitive


    【解决方案1】:

    1) bool 是 C++ 类型,BOOL 是 Objective-C 类型。 例如,从int 转换为BOOL 无法正常工作,因为YES 只是(BOOL)1 = (signed char)1 (= 0x001) 并且不等于(signed char)4 (= 0x100)。

    2) 两者都可以,第二个可能对于没有编程经验的人来说是不可读的。我更喜欢老式的 c 风格安全条件检查,左侧有常数,以防止意外遗漏等号之一。

    if (YES == isEnabled) {
    
    }
    

    【讨论】:

    • 只是添加“if (thatBool ? YES : NO) {” 是没用的,只是 if 中的 if (ifception!),是一样的。
    • 我喜欢 Yoda if 风格,我总是想象程序员真的会这样说话,而且很搞笑:)
    • 而且非常实用,其实:-D
    • 我发现 == 的反向操作数顺序令人不安 :) 最重要的是,我认为不再需要它,因为现代编译器会警告您 if (foo = YES) 赋值。
    • bool 在这种情况下是 is from C99,而不是 C++。
    【解决方案2】:

    我认为(BOOL)4096 被评估为0 是一个简单的算术溢出,就像(BOOL)256 一样,因为BOOL 是unsigned char。而且我认为!! 转换技巧(“双重否定”)效果很好:

    NSLog(@"%i", (BOOL)256); // 0
    NSLog(@"%i", !!256); // 1
    

    这意味着我会使用BOOL 来保持标准的 Cocoa 编码风格,并且只注意危险的类型转换。 thatBool ? YES : NO 的表情让我的眼睛很痛,你为什么要那样做? :)

    【讨论】:

    • !! 铸造技巧的任何链接?这些东西有点难搜索:)
    • 这是一个简单的double negation,应该更容易搜索。
    • 谢谢@zoul,是的,这很容易。我认为“注意危险的类型转换”是正确的。
    【解决方案3】:

    使用 int 时,您始终可以通过检查 int 是否等于特定值来明确设置 BOOL,例如

    BOOL yesNo = ((int)4096 > 0);
    BOOL enableButton = (someInt >= 16);
    

    换句话说,不要将 int 直接传递给 BOOL;把它变成一个真/假陈述。

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2012-11-17
      • 1970-01-01
      • 2018-08-06
      • 2020-03-13
      • 2011-10-04
      相关资源
      最近更新 更多