首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flip bool: x=!x与x^=1的性能比较

Flip bool: x=!x与x^=1的性能比较
EN

Stack Overflow用户
提问于 2014-03-26 17:57:38
回答 4查看 159关注 0票数 0

我知道两种翻转bool的技巧:

代码语言:javascript
复制
x = !x

代码语言:javascript
复制
x ^= 1

我更喜欢第二个,就像我更喜欢x++而不是x+=1而不是x=x+1一样。

但是它们能保证生成相同的汇编代码吗?

如果不是,有没有理由偏爱其中一个?

EN

回答 4

Stack Overflow用户

发布于 2014-03-26 18:00:32

对于相同的汇编代码,从来没有任何保证。是的,给定bool x,它们做的是完全相同的事情。是的,这意味着它们很可能是相同的。

以一种不寻常的方式编写表达式可能会使它们更快,这是一种常见的谬误。避免与任何基于这种想法养成习惯的人合作。

x = ! x更加清晰,因为!是根据布尔值定义的。

票数 4
EN

Stack Overflow用户

发布于 2014-03-26 18:58:11

我更喜欢第二个,就像我更喜欢x++而不是x+=1而不是x=x+1。

请选择第一个。它是大多数程序员所期望的,也很容易理解。第二种形式仅适用于整型情况下的值0和1。

但是它们能保证生成相同的汇编代码吗?

不是的。

,如果不是这样,有没有理由偏爱其中一个?

降低代码中"wtf/loc“的比例(即,每n行代码中,有多少次其他开发人员会看着你的代码说"WTF?!?”)。

编辑:无论哪种方式,您都可能永远看不到通过用一个表达式替换另一个表达式来提高应用程序速度的真实示例。这是一个风格问题,而不是性能问题。

票数 3
EN

Stack Overflow用户

发布于 2014-03-26 18:29:46

第二个表达式只是一个难以找到的bug的来源。例如,你可能认为某个表达式的类型是bool,而由于整数提升或通常的算术转换,它的实际类型是一些整型。

考虑下面的代码片段

代码语言:javascript
复制
unsigned int x = 3;

x ^= 1;

std::cout << x << std::endl;

if ( x == false ) std::cout << "All is O'k\n";
else std::cout << "Oops. Something is wrong!\n"; 

x = 3;

x = !x;

std::cout << x << std::endl;

if ( x == false ) std::cout << "All is O'k\n";
else std::cout << "Oops. Something is wrong!\n"; 

因此,使用expression x ^= 1;来翻转布尔值只会使代码的读者感到困惑。

所以我更喜欢使用x = !x;而不是x ^= 1;

不要忘记原则KISS:保持简单愚蠢。:)

例如,在C中,operator !的结果是int类型,但是操作的值不是0就是1。

来自C标准

5逻辑否定运算符的结果!如果其操作数的值不等于0,则为0;如果其操作数的值等于0,则为1。

因此,对于这两种语言,对于任何源值,都可以保证结果恰好是0或1。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22657304

复制
相关文章

相似问题

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