大多数语言使用true/false
布尔值的关键字。我发现即使 Smalltalk 也在使用true/false
. 我知道 Objective-C 只是从 Smalltalk 中借用概念,而不是语言本身,但我很好奇它为什么使用它YES/NO
而不是更广泛使用的true/false
. 有什么历史原因吗?
5 回答
Objective-C 被设计为(并且仍然是)C 的严格超集。创建者非常努力地确保他们不会以任何方式破坏与 C 的兼容性。他们还试图使他们的修改更加明显,这样就可以很容易地分辨出代码的哪些部分使用了 Objective-C,哪些部分使用了普通的 C。例如,@
用于表示 NSString 而不仅仅是使用引号。这允许纯 C 字符串与新字符串共存。
C 已经有一个非正式的 TRUE/FALSE 宏系统。我怀疑 Objective-C 的设计者选择 YES/NO 宏是为了避免冲突,并明确代码实际上是 Objective-C。还要注意“空”对象的用法nil
,而不是仅仅修改良好的旧 NULL 的行为。
Objective-C 是一种非常冗长的语言,所有方法都非常具有描述性,并且对布尔值使用 YES/NO 而不是 true/false 使其更易于阅读。
如果发生在现实生活中,您可能会觉得以下对话很奇怪: A:“你看过电影吗?” B:“真的”
如果 B 回答“是”(或“否”),这听起来很正常,并且通过使用 YES/NO 而不是 true/false,代码看起来更像是简单的英语。
苹果一直试图让事情变得更容易使用。如果您阅读了一些系统布尔方法并问自己使用 YES|NO
or来回答布尔问题更有意义TRUE|FALSE
,您会看到答案YES|NO
在我看来是感谢的。
否则,您始终可以TRUE|FALSE
在代码中使用。
YES
这很奇怪,但我发现使用/NO
宏而不是TRUE
/ FALSE
(这也可以) 代码更具可读性。
但是,Objective-C 现在是 C99 的超集,因此您应该尽可能使用 C99boolean
类型。我一直在玩弄定义和定义的想法,但到目前为止一直抵制它。true
false
yes
no
true
false
考虑这一点的最好方法是它是平行进化。
Objective-CBOOL
和YES
/的NO
历史可以追溯到 1980 年代初期,并且可能不仅是为了模仿其他语言,而且还想念 C 的未来发展。_Bool
, true
/ false
in 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;
}
}