比方说,我们有一个变量:是“!” intsead的“== 0”来检查int是否是0好的做法?
是不是好做的
if(!a)
{
// do some stuff
}
代替
if(a == 0)
{
// do some stuff
}
?因为它有效。
在第一个例子中,int会变成一个bool,那么没有static_cast<bool>(a)
就可以吗?另外如果a
大于1会发生什么?
比方说,我们有一个变量:是“!” intsead的“== 0”来检查int是否是0好的做法?
是不是好做的
if(!a)
{
// do some stuff
}
代替
if(a == 0)
{
// do some stuff
}
?因为它有效。
在第一个例子中,int会变成一个bool,那么没有static_cast<bool>(a)
就可以吗?另外如果a
大于1会发生什么?
在第一个例子中,int将变成一个bool,那么没有
static_cast<bool>(a)
就可以吗?
是的,没关系。将会有一个隐式转换。
另外如果
a
大于1会发生什么?
任何非0值都可以隐式转换为true
。相反,只有0值才会被视为false
。
您应该选择哪种方式?两者都很好。我喜欢用我的代码表达我的意图。如果我只希望如果运行语句时a
等于0时,我更喜欢
if (a == 0)
为表明正是我想要的。
我同意。而且,无论选择什么,都要保持一致。 – edmz
@black完全。一致地使用结构,缩进和空白是非常重要的。 – NathanOliver
这是有效的,人们使用它,但我认为它远离良好的做法。它给出了关于值的语义的错误观念。
0
通常被视为falsy,但这更像是C天的遗物而非其他任何东西。较新的语言甚至不允许使用它,因为它误导了读者对代码的价值。
_“0通常被视为虚假,但更多的是来自C天的遗迹”_不,0是错误的,1是真的,因为它来自布尔代数。 – edmz
不,布尔代数不知道“0”和“1”,它只知道“true”和“false”。有时将“0”和“1”用作这些的简写值,但它们在概念上完全不同。 –
_“是否可以做 'if(!a)'”_当然。 –
从技术上讲,所有条件句都是'if' /'while'/etc。甚至不需要'bool'。它们只能转换为整数值,然后,如果值等于零 - 则将其视为错误,否则视为错误。但是,由于更好的可读性,我个人更喜欢'if(a == 0)'。此外,关于“良好行为”的问题总是基于意见。 –
当然,它的工作原理和它的标准都有很好的定义 - 有一个从int到bool的转换,其中0被认为是false,非零被认为是true。但是请记住,你正在为其他人(包括你自己的未来)编写代码来阅读。写'if(a == 0)'是一个更明确的意图声明。经验丰富的程序员会正确地解释“if(!a)”,但是您提出这个问题的事实突出显示了当您的陈述不能反映您的高层意图时,它会产生多大的问题。 – Andrew