我知道两种翻转bool的技巧:
x = !x和
x ^= 1我更喜欢第二个,就像我更喜欢x++而不是x+=1而不是x=x+1一样。
但是它们能保证生成相同的汇编代码吗?
如果不是,有没有理由偏爱其中一个?
发布于 2014-03-26 18:00:32
对于相同的汇编代码,从来没有任何保证。是的,给定bool x,它们做的是完全相同的事情。是的,这意味着它们很可能是相同的。
以一种不寻常的方式编写表达式可能会使它们更快,这是一种常见的谬误。避免与任何基于这种想法养成习惯的人合作。
x = ! x更加清晰,因为!是根据布尔值定义的。
发布于 2014-03-26 18:58:11
我更喜欢第二个,就像我更喜欢x++而不是x+=1而不是x=x+1。
请选择第一个。它是大多数程序员所期望的,也很容易理解。第二种形式仅适用于整型情况下的值0和1。
但是它们能保证生成相同的汇编代码吗?
不是的。
,如果不是这样,有没有理由偏爱其中一个?
降低代码中"wtf/loc“的比例(即,每n行代码中,有多少次其他开发人员会看着你的代码说"WTF?!?”)。
编辑:无论哪种方式,您都可能永远看不到通过用一个表达式替换另一个表达式来提高应用程序速度的真实示例。这是一个风格问题,而不是性能问题。
发布于 2014-03-26 18:29:46
第二个表达式只是一个难以找到的bug的来源。例如,你可能认为某个表达式的类型是bool,而由于整数提升或通常的算术转换,它的实际类型是一些整型。
考虑下面的代码片段
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。
https://stackoverflow.com/questions/22657304
复制相似问题