在下面的代码中,使用(!!p)代替的有(p != NULL)什么好处?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
Run Code Online (Sandbox Code Playgroud) 可能重复:
C++代码中的双重否定.
我正在阅读代码库,并找到这样的东西:
#define uassert(msgid, msg, expr) (void)((!!(expr))||(uasserted(msgid, msg), 0))
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么(!!(expr))而不是单个(expr).无论如何,双重否定意味着积极,不是吗?我错过了什么吗?
寻找关于如何使用HWND窗口进行全屏模式的一些解释,我发现这个响应Win32:全屏和隐藏任务栏
铬响应代码有这一行:
saved_window_info_.maximized = !!::IsZoomed(hwnd_);
Run Code Online (Sandbox Code Playgroud)
来自此文件https://src.chromium.org/viewvc/chrome/trunk/src/ui/views/win/fullscreen_handler.cc?revision=HEAD&view=markup on the line 56
我读:
var bar equal not not of mother method
Run Code Online (Sandbox Code Playgroud)
它是否正确 ?
这个"!! :: IsZoomed()"是什么意思?
为什么不呢
saved_window_info_.maximized = CWnd::IsZoomed(hwnd_);
Run Code Online (Sandbox Code Playgroud)
?
我经常看到有经验的程序员写!!x,即使预期的表达式是布尔值(即零或非零)而不是整数。
例如,来自 boost 的一行:
BOOST_ASSERT(!!p); // where `p` is a pointer
Run Code Online (Sandbox Code Playgroud)
什么!!p时候才p做呢?
我对布尔参数的理解是将表达式转换为整数类型的值,并将该值与零、显式或隐式(使用if或其三元运算符等效)进行比较。
因此,如果我对 Boolean 的理解是正确的,那么任何需要 Boolean 并且只期望0或被1错误实现的东西。
澄清一下:很明显,!转换为bool; 问题是明确询问为什么。
可能重复:
C++代码中的双重否定.
我正在使用生产代码,我已经在这样的语句中运行了几次:
Class.func(!!notABool);
Run Code Online (Sandbox Code Playgroud)
前几次我把它视为一个programmer quirk(也许是为了强调它是一个条件语句,而不是一个数字传递给func?)但是我遇到了几个使用上面的语句,现在我想知道它是否真的使差异与否.在大多数情况下notABool是一个数字(int,float,double ......我已经看过所有3)我最初的猜测是它类似于输入:
Class.func((bool)notABool);
Run Code Online (Sandbox Code Playgroud)
但我不完全确定?
bool在评估if()语句中的条件时,C++的现代版本尝试使用类的运算符.其他铸造操作员,例如int在没有bool操作员时使用.这在下面说明.
#include <iostream>
using namespace std;
class TwoInts {
public:
int a,b;
operator bool() { cout << "TwoInts to bool" << endl; return 0;}
operator int() { cout << "TwoInts to int" << endl; return 0;}
};
class SixInts {
public:
int a[6];
operator int() { cout << "SixInts to int" << endl; return 0;}
};
int main(void) {
TwoInts T;
SixInts S;
if (T) cout << "xxx" << endl;
if (S) cout …Run Code Online (Sandbox Code Playgroud) 我从Microsoft的GSL实现(C++指南支持库)中看到了这段代码:
#if defined(__clang__) || defined(__GNUC__)
#define GSL_LIKELY(x) __builtin_expect(!!(x), 1)
#define GSL_UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
#define GSL_LIKELY(x) (!!(x))
#define GSL_UNLIKELY(x) (!!(x))
#endif
Run Code Online (Sandbox Code Playgroud)
我读到了__builtin_expect(这里和这里),但我仍然不清楚双boolean否定运算符的目的是什么(!!(x)).为什么用它?
有问题的文件就是这个.
可能重复:
什么!! 红宝石意味着什么?
这个功能在做什么?
def current_product?
!!current_product
end
Run Code Online (Sandbox Code Playgroud)
这不是双重否定吗?
可能重复:
C++代码中的双重否定
在阅读我读到的一个代码时:
flush = ! !(flags & GST_SEEK_FLAG_FLUSH);
Run Code Online (Sandbox Code Playgroud)
我没有得到!!这里的意思.这句话怎么办?
编辑:
我得到了它的双重否定.将非bool数据转换为bool的技巧
但那有什么需要呢?这里冲洗是bool然后如果你将任何非零项目分配给bool它会将1和零项目视为0,所以这样做有什么好处?
我应该如何理解这样的代码?特别是我想知道在'\'后的第二部分发生了什么.任何人都可以解释一下它是如何工作的?
#define except(expression, message) (void) \
(!!(expression) || (throw std::runtime_error(message), false))
Run Code Online (Sandbox Code Playgroud) 有时,我看到以下代码:
if ( !!on_debugging )
Run Code Online (Sandbox Code Playgroud)
这是一样的
if ( on_debugging )
Run Code Online (Sandbox Code Playgroud)
我不明白为什么要使用这两个.有什么区别吗?