大家,我对C ++有一些疑问,你实际上更喜欢使用什么
int* var = 0;
if(!var)...//1)
or
if(var == 0)..//2)
有什么优点和缺点?提前谢谢
答案 0 :(得分:9)
我更喜欢if (!var)
,因为您不会意外地分配到var
,而且您不必在0
和NULL
之间进行选择。
答案 1 :(得分:5)
我一直被教导使用if (!var)
,似乎我读过的所有惯用的C(++)都遵循这一点。这有一些很好的语义:
var
不存在”或“如果未设置var”var
是布尔值,则会严格地映射你惯用的内容(在C中没有bool,但人们仍然模仿它们的使用)if (!isEmpty(nodeptr)) { .. }
答案 2 :(得分:2)
主要是个人偏好。有人会建议第一个是首选,因为不可能意外分配而不是比较。但同样的道理,如果你养成了将rvalue放在比较左边的习惯,编译器会在你吹掉它时抓住你:
if( 0 == var )
......这当然是对的。我只是觉得if( !var )
更具表现力,而且打字更少。
他们都会评估相同,所以没有运行时差异。最重要的是你选择一个并且坚持下去。不要将其中一种混合使用。
答案 3 :(得分:1)
任何一个都是好的,虽然我个人更喜欢2 - 或类似的东西。
让我更有意义阅读:
if ( ptr != NULL )
大于
if ( ptr )
第二个我可能会因为只是一个布尔值而感到困惑,但第一个我能够立刻告诉它它是一个指针。
无论哪种方式,我认为选择一个并坚持这一点以保持一致性非常重要 - 而不是在整个产品中以不同的方式完成它。
答案 4 :(得分:1)
几年过去了......
C ++ 11标准引入nullptr
来检查空指针,应该使用它,因为它确保比较实际上是在指针上完成的。
因此,最强大的检查将是:
if(myPtr != nullptr)
!var
的问题在于,如果var是布尔值或数值(int,byte等......),它将测试它们是否等于0。
如果您使用nullptr
,则可以确定您正在检查的指针不是任何其他类型:
例如:
int valA = 0;
int *ptrA = &valA;
if(!valA) // No compile error
if(!*ptrA) // No compile error
if(!ptrA) // No compile error
if(valA != nullptr) // Compile error, valA is not a pointer
if(*ptrA != nullptr) // Compile error, *ptrA is not a pointer
if(ptrA != nullptr) // No compile error
因此,在示例中操作指向int的指针时很容易出错,这就是为什么应该使用nullptr
。
答案 5 :(得分:0)
我更喜欢选项3:
if(not var)
{
}
C ++的新(自1998年以来)运算符关键字可以使代码更容易阅读。
奇怪的是,他们似乎很不为人知。似乎有更多的人知道什么是三字母(谢谢IOCCC!),而不是那些知道运算符关键字的人。运算符关键字存在类似的原因:即使键盘不提供所有ANSII字符,它们也允许使用C ++编程。但与trigraphs相反,运算符关键字使代码更具可读性而不是混淆代码。
答案 6 :(得分:0)
根据高完整性C ++编码标准手册:用于常量和变量之间的比较,您应该将常量放在左侧以防止赋值而不是相等比较,例如:
Avoid:
if(var == 10) {...}
Prefer
if(10 == var) {...}
特别是在你的情况下,我更喜欢if(0 == var),因为很明显你将指针比较为null(0)。因为!运算符可以重载然后它可能有其他含义,具体取决于指针指向的内容: if(!(* var)){...} 。
答案 7 :(得分:0)