"!!"(否定两次)的用法是什么?
What is the usage of "!!" (negating twice)?
可能重复:
C++码中的二重否定
比方说:
bool var = !!true;
它将为变量指定"true"。看起来没用,但我看到了Visual Studio对"断言"的定义,它是:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
为什么它两次否定"_Expression"?
我想知道他们想强制调用"!"运算符(在它过载的情况下),但这似乎不是一个好的理由。
!!
保证结果将以1或0结束,而不仅仅是_Expression
或0的值。在C中,这不太重要,但在C++中,我认为它将表达式的结果转换为bool
类型,这在某些情况下可能很有用。如果您确实有一些API需要将文字1或0传递给它,那么使用!!
将是实现这一点的一种方法。
您可能想要一个1
或0
的int变量。
例如,你不能传递一个5
,相反,双重否定会把5
变成1
。
另外,看看TRUE
是如何定义的:
#ifndef TRUE
#define TRUE 1
#endif
因此,一个类似于的表达式
int x = 5;
if ( x == TRUE )
{
//....
}
不会通过,而
if ( x )
{
//....
}
会的。
它的用途是确保值为0或1。我认为这对于C++的bool类型来说是多余的。
相关文章:
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- 使用 MSVC 编译时,msdpb* 文件的正确用法是什么?
- 引用和指向常量的指针的用法是什么
- 在这个C++代码中捕获的用法是什么
- constexpr 标准函子的正确用法是什么?
- ./lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a 的用法是什么
- std::forward 在参数传递中的用法是什么?
- Boost:创建一组线程并等待所有线程的正确习惯用法是什么
- while(1)的用法是什么
- 逆方差的常见编程用法是什么?
- catch站点中异常的常见用法是什么
- ()运算符的这种特殊用法是什么意思
- 逗号运算符的正确用法是什么
- "!!"(否定两次)的用法是什么?
- CMake "project"指令的正确用法是什么
- “(无效)D”的用法是什么
- 在 C 语言中 &(AND) 运算符的用法是什么?
- 函数体中变量强制转换为 void 的这种用法是什么?
- std::unique_ptr 在推送到 std::vector 时的正确用法是什么?
- 取代snprintf(3)的c++习惯用法是什么?