18

大多数语言使用true/false布尔值的关键字。我发现即使 Smalltalk 也在使用true/false. 我知道 Objective-C 只是从 Smalltalk 中借用概念,而不是语言本身,但我很好奇它为什么使用它YES/NO而不是更广泛使用的true/false. 有什么历史原因吗?

4

5 回答 5

35

Objective-C 被设计为(并且仍然是)C 的严格超集。创建者非常努力地确保他们不会以任何方式破坏与 C 的兼容性。他们还试图使他们的修改更加明显,这样就可以很容易地分辨出代码的哪些部分使用了 Objective-C,哪些部分使用了普通的 C。例如,@用于表示 NSString 而不仅仅是使用引号。这允许纯 C 字符串与新字符串共存。

C 已经有一个非正式的 TRUE/FALSE 宏系统。我怀疑 Objective-C 的设计者选择 YES/NO 宏是为了避免冲突,并明确代码实际上是 Objective-C。还要注意“空”对象的用法nil,而不是仅仅修改良好的旧 NULL 的行为。

于 2011-06-21T06:14:29.460 回答
4

Objective-C 是一种非常冗长的语言,所有方法都非常具有描述性,并且对布尔值使用 YES/NO 而不是 true/false 使其更易于阅读。

如果发生在现实生活中,您可能会觉得以下对话很奇怪: A:“你看过电影吗?” B:“真的”

如果 B 回答“是”(或“否”),这听起来很正常,并且通过使用 YES/NO 而不是 true/false,代码看起来更像是简单的英语。

于 2011-06-21T06:21:16.573 回答
3

苹果一直试图让事情变得更容易使用。如果您阅读了一些系统布尔方法并问自己使用 YES|NOor来回答布尔问题更有意义TRUE|FALSE,您会看到答案YES|NO在我看来是感谢的。

否则,您始终可以TRUE|FALSE在代码中使用。

于 2011-06-21T06:07:13.330 回答
2

YES这很奇怪,但我发现使用/NO宏而不是TRUE/ FALSE(这也可以) 代码更具可读性。

但是,Objective-C 现在是 C99 的超集,因此您应该尽可能使用 C99boolean类型。我一直在玩弄定义和定义的想法,但到目前为止一直抵制它。truefalseyesnotruefalse

于 2011-06-21T08:09:55.020 回答
2

考虑这一点的最好方法是它是平行进化。

Objective-CBOOLYES/的NO历史可以追溯到 1980 年代初期,并且可能不仅是为了模仿其他语言,而且还想念 C 的未来发展。_Bool, true/ falsein C 仅在 1999 年成为标准的一部分。

YES历史也是如此NO?是的。它们只是历史性的吗?不。正如NULL不是纯粹意义上的 3-3 的结果(尽管NULL经常被定义为0,或者如果它是随便可用的),true也不是BOOL.

您不会(我认为)编写此代码:

int matches = NULL;
for (int i = 0; i<count; ++i) {
    if (array[i] == value) ++matches;
}

这不太明显是错误的,但它在同一个范围内:

BOOL foundMatch = false;
for (int i = 0; i<count; ++i) {
    if (array[i] == value) {
        foundMatch = YES;
        break;
    }
}
于 2013-06-25T17:37:26.530 回答