我应该测试是否等于1或不等于0?

时间:2010-06-07 20:21:16

标签: performance language-agnostic coding-style

我前几天在这里编写代码,用一些整数编写if语句,这些整数总是01(实际上充当bool s)。我问自己:

当测试阳性结果时,哪个更好;测试int == 1int != 0

例如,给定一个int n,如果我想测试它是true,我应该使用n == 1还是n != 0

在速度,处理能力等方面有什么不同吗?

请忽略int可能比1 / 0更多/更少的事实,这是无关紧要的,也不会发生。

17 个答案:

答案 0 :(得分:47)

人类的大脑更好的流程语句不包含否定,这使得“int == 1”更好的方式。

答案 1 :(得分:35)

这取决于。如果您使用支持布尔值的语言,则应使用布尔值,而不是整数,即:

if (value == false)

if (value == true)

话虽如此,使用真正的布尔类型,它只是写得非常有效(通常更好):

if (!value)

if (value)

在大多数现代语言中,使用整数进行布尔运算的确很少。

话虽如此,如果您使用的语言不直接支持布尔值,那么这里最好的选择实际上取决于您如何定义真假。通常,false为0,true不是0。在这种情况下,使用if (i == 0)(用于错误检查)和if (i != 0)进行真正的检查。

如果你保证0和1是唯一的两个值,我可能会使用if (i == 1),因为否定更复杂,更有可能导致维护错误。

答案 2 :(得分:10)

如果你正在处理的值只能是1或0,那么我建议你先使用布尔值,然后再做if (bool)if (!bool)

答案 3 :(得分:9)

在非0的int表示布尔值'true'和0'false'的语言中,与C一样,我倾向于使用if (int != 0),因为它表示与if (int)相同的含义而int == 1表示整数值等于1而不是布尔值true。可能只是我。在支持布尔类型的语言中,始终使用它而不是整数。

答案 4 :(得分:7)

真的是Daft的问题。如果你测试1,测试1,如果你测试为零,测试为零。

添加else语句可以使选择看似随意。我会选择哪个最有意义,或者具有更多的上下文意义,默认或“自然”行为,例如预期的出现频率。

int == 0int != 1之间的这种选择很可能归结为可能不值得担心的主观评价。

答案 5 :(得分:6)

两点:

1)如上所述,更明确的是胜利。如果您向空列表添加内容,您不仅希望其大小不为零,而且还希望它明确为1.

2)你可能想做     (1 == int) 这样,如果你忘了=你最终会遇到编译错误,而不是调试会话。

答案 6 :(得分:3)

老实说,如果int的值只有1或0,你甚至可以说:

if (int)

这与说

相同
if (int != 0)

但你可能想要使用

if (int == 1)

因为即使你说不担心答案,否则不会为0而可能让答案不是1。

答案 7 :(得分:2)

IF INT IS 1
NEXT SENTENCE
ELSE MOVE "INT IS NOT ONE" TO MESSAGE.

答案 8 :(得分:2)

如果只有两个值,那么我会使用第一个:

if(int == 1)

因为它更明确。如果价值没有限制,我会不这么认为。

答案 9 :(得分:2)

正如其他人所说,使用==比使用!=更容易阅读。

也就是说,大多数处理器都有一个特定的比较为零的操作。它取决于具体的编译器,处理器等,但结果!= 0使用== 1可能会有一个几乎无法估量的小速度优势。

大多数语言都会让你使用if (int)if (!int),这样更具可读性,可以获得极小的速度加成。

答案 10 :(得分:2)

我是偏执狂。如果值为01,则可能为2。可能不是今天,可能不是明天,但是一些维护程序员会在子类中做一些奇怪的事情。有时我自己犯错误 [嘘,不要告诉我的雇主] 。所以,让代码说告诉我价值是01,否则它会对木乃伊哭泣。

if (i == 0) {
    ... 0 stuff ...
} else if (i == 1) {
    ... 1 stuff ...
} else {
    throw new Error();
}

(您可能更喜欢switch - 我发现它在大括号语言中的语法太重了。)

答案 11 :(得分:1)

当使用整数作为布尔值时,我更喜欢将它们解释如下:false = 0,true =非零。

我会将条件语句写为 int == 0 int!= 0

答案 12 :(得分:1)

我会说这取决于语义,如果条件意味着

while ( ! abort )否定是可以的。

if ( quit ) break;也可以。

答案 13 :(得分:1)

if( is_numeric( $int ) ) { its a number }
elseif( !$int ) { $int is not set or false }
else { its set but its not a number }

讨论结束:P

答案 14 :(得分:1)

我同意大多数人在这篇文章中所说的话。如果您有两种不同的可能性,那么使用布尔值会更有效。它还使代码更容易阅读和解释。

if(bool){...}

答案 15 :(得分:1)

我来自c世界。起初我对Objective-c了解不多。过了一段时间,我更喜欢这样的东西:

if (int == YES)

if (int == NO)
c中的

,即:

if (int == true)
if (int == false)

这些天,我使用varchar代替integer作为表格键,例如。

 name   marital_status
------  --------------
 john      single
 joe       married

好多了:

 name   marital_status
------  --------------
 john         S
 joe          M

 name   marital_status
------  --------------
 john         1
 joe          2

答案 16 :(得分:0)

(假设你的整数只能是1或0)这两个陈述在逻辑上是等价的。我建议使用==语法,因为我认为当你不引入不必要的否定时,大多数人都会更清楚。