我刚刚进入一个拥有相当庞大代码库的项目.
我主要处理C++,他们编写的很多代码都使用布尔逻辑的双重否定.
if (!!variable && (!!api.lookup("some-string"))) {
do_some_stuff();
}
Run Code Online (Sandbox Code Playgroud)
我知道这些人都是聪明的程序员,很明显他们不会偶然这样做.
我不是经验丰富的C++专家,我唯一猜测他们这样做的原因是他们想要绝对肯定被评估的值是实际的布尔表示.所以他们否定它,然后再次否定它以使其恢复到它的实际布尔值.
这是正确的,还是我错过了什么?
[这个问题有关,但并不等同于这一个 ]
我的编译器警告隐式转换或将某些类型转换为bool,而显式转换不会产生警告:
long t = 0;
bool b = false;
b = t; // performance warning: forcing long to bool
b = (bool)t; // performance warning
b = bool(t); // performance warning
b = static_cast<bool>(t); // performance warning
b = t ? true : false; // ok, no warning
b = t != 0; // ok
b = !!t; // ok
Run Code Online (Sandbox Code Playgroud)
这是使用Visual C++ 2008但我怀疑其他编译器可能有类似的警告.
所以我的问题是:铸造/转换的性能影响是什么bool?在某些情况下(例如,对于某些目标体系结构或处理器),显式转换是否具有更好的性能?隐式转换是否会以某种方式混淆优化器?
微软对其警告的解释并不是特别有用.他们暗示有充分的理由,但他们没有解释.
我见过人们使用带有两个'!'的条件子句的代码
#define check_bit(var, pos) (!!((var) & (1 << (pos))))
#define likely(x) __builtin_expect(!!(x),1)
#define unlikely(x) __builtin_expect(!!(x),0)
Run Code Online (Sandbox Code Playgroud)
是我能找到的一些例子.
使用!!(condition)结束有什么好处(condition)吗?
当我在Visual Studio 2008中编译下面的代码片段代码时,我收到此警告.
BOOL
CPlan::getStandardPlan() const
{
return m_standardPlan;
}
bool m_bStandardPlan;
if(plan!=NULL)
{
// Assign the values to the Cola object
poCola->m_lPlanId = plan->getPlanId();
poCola->m_lPlanElementId = plan->getPlanElementId();
poCola->m_lPlanElementBaseId = plan->getPlanElementBaseId();
poCola->m_bStandardPlan = plan->getStandardPlan(); //C4800
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我提到了以下链接,
http://msdn.microsoft.com/en-us/library/b6801kcy%28v=vs.90%29.aspx
警告C4800:'int':强制值为bool'true'或'false'(性能警告)
我不确定如何修复此警告.
在下面的代码中,使用(!!p)代替的有(p != NULL)什么好处?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
Run Code Online (Sandbox Code Playgroud) 这里有一个相当直截了当的问题.正在查看一些代码,我已经看到了一个似乎将给定变量转换为布尔值的函数.它是这样的:
function to_bool( $var ) {
return !!$var;
}
Run Code Online (Sandbox Code Playgroud)
很简单,但它是如何工作的?从来没有见过这个,谷歌搜索并没有真正让我到任何地方.额外的'!' 翻转结果?'!$ var'可用于检查var是否为false,'!!'也是如此 将'false'变为true,反之亦然?
当我尝试从文件中读取一个整数并使bool变量等于它时,我在MSVC++中收到警告.
accessLV[i] = FileRead(file1, i + 1);
Run Code Online (Sandbox Code Playgroud)
(accessLV是一个bool数组,FileRead是我为减少从文件读取所涉及的语法而做的一个函数,我是因为该语句在for循环中)
我尝试过使用static_cast:
accessLV[i] = static_cast<bool>(FileRead(file1, i + 1));
Run Code Online (Sandbox Code Playgroud)
但我仍然得到警告.我试过这样做(我不确定确切的术语):
accessLV[i] = (bool)FileRead(file1, i + 1));
Run Code Online (Sandbox Code Playgroud)
警告仍在那里.反正有没有使accessVV成为一个整数的数组摆脱警告?
注意:这是FileRead的语法,如果它有帮助:
int FileRead(std::fstream& file, int pos)
{
int data;
file.seekg(file.beg + pos * sizeof(int));
file.read(reinterpret_cast<char*>(&data), sizeof(data));
return data;
}
Run Code Online (Sandbox Code Playgroud)