我必须维护一个相当老的Visual C++源代码的大型代码库。我找到了如下代码:
bIsOk = !!m_ptr->isOpen(some Parameters)bIsOk的数据类型为bool,isOpen(..)返回BOOL (定义为int)
工程师告诉我,据说这是从BOOL到bool的最有效的方法。
这是正确的吗?现在还是这样吗?2019年?
发布于 2019-02-23 02:15:29
!!的原因不是效率--任何优秀的编译器都会把它编译成与任何其他非疯狂的转换方式完全相同的东西,包括仅仅依赖于隐式转换--而是它抑制了关于隐式缩小到bool的compiler warning,它存在于VisualStudio中的微软编译器的旧版本中,但在VS2017中被删除了。
发布于 2019-02-23 02:10:54
我假设您指的是Win32类型BOOL,它是一种用于int的typedef,具有历史上的C兼容性。
!!对布尔值进行规范化,将任何非零(即TRUE)值更改为1/true。至于效率,这是很难解释的。对布尔值进行规范化的其他方法(x || 0、x && 1、(x != 0)等)任何一个好的编译器都应该优化到相同的东西。
也就是说,如果显式地需要规范化,那么就不应该这样做,除非其目的是抑制编译器警告。
发布于 2019-02-23 02:23:50
bVariable = !!iVariable与bVariable = (iVariable != 0)
你应该首先考虑可读性,让编译器生成高效的代码。
如果你有这样的任务,只需将一个分配给另一个:
bVariable = iVariable;因为int到bool的转换是定义良好的,任何C++程序员都应该能读懂。
如果需要转换变量或表达式,请使用正确C++方式- static_cast
template<class T>
void foobar( T t );
foobar( static_cast<bool>( iVariable ) ); // explicitly let reader know that you changing typehttps://stackoverflow.com/questions/54832788
复制相似问题