首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bVariable = !!iVariable与bVariable = (iVariable != 0)

bVariable = !!iVariable与bVariable = (iVariable != 0)
EN

Stack Overflow用户
提问于 2019-02-23 02:07:27
回答 5查看 137关注 0票数 2

我必须维护一个相当老的Visual C++源代码的大型代码库。我找到了如下代码:

代码语言:javascript
运行
复制
bIsOk = !!m_ptr->isOpen(some Parameters)

bIsOk的数据类型为boolisOpen(..)返回BOOL (定义为int)

工程师告诉我,据说这是从BOOLbool的最有效的方法。

这是正确的吗?现在还是这样吗?2019年?

EN

回答 5

Stack Overflow用户

发布于 2019-02-23 02:15:29

!!的原因不是效率--任何优秀的编译器都会把它编译成与任何其他非疯狂的转换方式完全相同的东西,包括仅仅依赖于隐式转换--而是它抑制了关于隐式缩小到boolcompiler warning,它存在于VisualStudio中的微软编译器的旧版本中,但在VS2017中被删除了。

票数 8
EN

Stack Overflow用户

发布于 2019-02-23 02:10:54

我假设您指的是Win32类型BOOL,它是一种用于inttypedef,具有历史上的C兼容性。

!!对布尔值进行规范化,将任何非零(即TRUE)值更改为1/true。至于效率,这是很难解释的。对布尔值进行规范化的其他方法(x || 0x && 1(x != 0)等)任何一个好的编译器都应该优化到相同的东西。

也就是说,如果显式地需要规范化,那么就不应该这样做,除非其目的是抑制编译器警告。

票数 3
EN

Stack Overflow用户

发布于 2019-02-23 02:23:50

bVariable = !!iVariable与bVariable = (iVariable != 0)

你应该首先考虑可读性,让编译器生成高效的代码。

如果你有这样的任务,只需将一个分配给另一个:

代码语言:javascript
运行
复制
bVariable = iVariable;

因为intbool的转换是定义良好的,任何C++程序员都应该能读懂。

如果需要转换变量或表达式,请使用正确C++方式- static_cast

代码语言:javascript
运行
复制
template<class T>
void foobar( T t );

foobar( static_cast<bool>( iVariable ) ); // explicitly let reader know that you changing type
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54832788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档