if(x==0)
与if(!x)
的区别是什么?或者他们总是相同?对于不同的C ++内置类型的x
:
bool
int
char
pointer
iostream
答案 0 :(得分:2)
如果(!x)的
是“如果x不是假”,这意味着为了评估它,您可能必须将x转换为bool。
>> 这可能有害,如果您想避免它,您应该使用类似Safe Bool Idiom
的内容如果(X!= 0)
表示“如果x不为0”,则评估将x与0进行比较。这可能还涉及隐式转换。
>> 当以这种方式使用指针时要小心,C ++ 11引入了 nullptr 以避免混淆 NULL == 0 (语义不同):What exactly is nullptr?
答案 1 :(得分:2)
假设存在从某种类型转换为支持if (x)
或if (!x)
的内容的转换,那么只要operator int()
的转换不是opterator bool()
而不是if (x == 0)
,结果将是一样的。
bool
将使用“最佳”转换,其中包含void *
或if(!x)
转换器。只要有任何转换器可以将类型转换为某种“标准类型”。
class
{
int x;
public:
bool operator bool() { return x != 0; }
int operator int() { return x == 0; }
};
将完全相同,它将使用任何转换为标准类型的转换器。
这两个当然都假设转换器功能不是C ++ 11“不要默认转换”。
当然,如果你有这样的课程:
if (x == 0)
然后if ( (x == 0) == 0)
会if (!x)
而if (! (x != 0)
会operator int()
执行false
,这是不一样的。但现在我们真的在努力制造麻烦,这是非常糟糕的设计代码。
当然,上述示例可能会导致任何x == 0
出错,导致true
{{1}}和{{1}}所有其他值。
答案 2 :(得分:1)
考虑您要处理的内容
如果它是 boolean ,结果非常清楚:
if (!false) // If false TRUE
if (false==0) // If false TRUE
如果是整数,请注意!
条件
if (0==0) // Unexpected behaviors are missing..
if (!-1) // False
if (! 0) // True
if (! 1) // False
对于 chars ,两个条件都给出了相同的结果:
if (! ' ') // nothing
if (' '==0) // nothing
if (! 'z') // nothing
if ('z'==0) // nothing
答案 3 :(得分:0)
这一切都取决于x的类型。例如,
if(cin)
来检查iostream类型是否没有错误。没有等效的cin!= 0。
此外,大多数运营商也可以过载和转换。
答案 4 :(得分:0)
只需!x 将为每个“false”值返回true(即0,null,false等),而 x!= 0 将返回true, iff x不等于 0 。