条件检查:if(x==0) vs. if(!x)
Condition checking: if(x==0) vs. if(!x)
if(x==0)
和有什么区别。 if(!x)
?还是它们总是等价的?对于不同C++内置类型的x
:
-
bool
-
int
-
char
-
pointer
-
iostream
- 。
假设有一个类型到支持if (x)
或if (!x)
的东西的转换,那么只要operator int()
没有与opterator bool()
不同的转换,结果将是相同的。
if (x == 0)
将使用"最佳"转换,其中包括bool
或void *
转换器。只要有任何转换器可以将类型转换为某种"标准类型"。
if(!x)
将执行完全相同的操作,它将使用任何转换为标准类型的转换器。
当然,这两个都假设转换器函数不是 C++11"不默认转换"。
当然,如果你有这样的类:
class
{
int x;
public:
bool operator bool() { return x != 0; }
int operator int() { return x == 0; }
};
然后if (x == 0)
会做if ( (x == 0) == 0)
,if (!x)
会做if (! (x != 0)
,这是不一样的。但是现在我们真的在试图制造麻烦,这是设计非常糟糕的代码。
当然,上面的示例可能会出错,任何不会导致x == 0
false
和所有其他值true
operator int()
。
if(!x)
是"如果 x 不是假的",这意味着为了评估这一点,你可能必须将 x 转换为布尔值。
>> 这可能是有害的,如果你想避免它,你应该使用类似安全布尔成语的东西
if(x!=0)
表示"如果 x 不是 0",因此将 x 与 0 进行比较进行评估。这可能还涉及隐式转换。
>> 以这种方式使用指针时要小心,C++11 引入了一个 nullptr 以避免 NULL==0 的混淆(语义不同): nullptr 到底是什么?
考虑您要处理的内容
如果是布尔值,结果非常清楚:
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
对于字符,这两个条件给我相同的结果:
if (! ' ') // nothing
if (' '==0) // nothing
if (! 'z') // nothing
if ('z'==0) // nothing
不,这一切都取决于x的类型。例如
if(cin)
在 STL 中用于检查 IOstream 类型是否没有错误。没有等效的 cin != 0。
此外,大多数运算符都是可重载的,也可以转换。
简单地说!x 将为每个"假"值(即 0、空、假等)返回 true,而 x!=0 将返回真,iff x 不等于 0。
- C++20. is_constant_evaluated() vs if constexpr
- if else VS映射查找
- 性能:否则如果 vs if 在已经返回的函数中
- 如果 constexpr vs if 与常量
- if constexpr vs sfinae
- Visual Studio C++ 完全忽略 if 语句或 if 语句中的行.VS 2015
- "constexpr if" vs "if" 与优化 - 为什么需要"constexpr"?
- 条件运算符vs if then else
- 条件检查:if(x==0) vs. if(!x)
- #if vs #ifndef vs #ifdef
- static const std::map<string, int> vs if-elseif
- 事件是 SFML.切换语句 VS if 语句
- VS C++:树状 if/else 结构的代码生成需要很长时间
- 这些语句是否相同 if (x - y) {} vs. if (x !=y) {}
- if/else vs虚拟功能:设计性能
- VS2010上不区分大小写的字符串比较-为每个版本的VS播放#if定义的语句
- 我不能在VS 2013中使用if(ifs == NULL)命令
- 嵌套IF语句vs IF- else
- 2个while循环vs if else语句在1个while循环中
- 嵌套if VS . 2独立if——性能方面