代码示例:
float f = 123.456;
int i = 12345;
// negate by changing sign
i = -i;
f = -f;
// negate by multiplying with -1
i *= -1;
f *= -1.0f;
除了美学之外,还有什么事实可以说明为什么人们应该更喜欢一种方式而不是另一种方式?
对我来说乘法似乎有点不必要。但我更经常看到乘法风格,并且想听听除了偏好之外是否还有充分的理由。
最佳答案
基于我对“fastest-way-to-negate-a-number ”
速度
similar question 的答案表示:
- 您应该忘掉速度,选择您认为最易读的成语。
- 几乎所有编译器都会为
a = -a
、a *= -1
等生成等效的最佳代码(可能是一条指令)。- 但尽管 MSVS 2012(优化?)对每条指令使用一条指令,
= -a
需要 1 个周期,*= -1
需要 3 个周期。
- 但尽管 MSVS 2012(优化?)对每条指令使用一条指令,
- 任何让它变得更快的尝试都会大大降低它的可读性,并且很容易让它变得更慢。
- 如果您需要优化,您应该从分析生成的代码和性能开始。
副作用和冗余
然而,*= -1
惯用语有一个实际优势:您只需要写一次左侧,并且只计算一次。当 LHS 较长、复杂或昂贵或可能有副作用时,这是相关的:
(valid ? a : b)[prime_after(i++)] *= -1;
*look_up (input) *= -1; // Where look_up may have side-effects
parity[state][(unsigned int)getc(stdin)] *= -1;
variable_with_a_long_explanatory_name *= -1;
这种冗余的另一个优点是,在查找错误时,可以确定该数字确实在原位被取反,并且这两个表达式没有细微差别。 p>
一旦采用了一种成语,人们往往会在其他情况下坚持使用它,因此坚持*= -1
是可以理解的。
关于c++ - 取负值时 "x = -x"和 "x *= -1"之间是否存在功能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483535/