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