c++ - 取负值时 "x = -x"和 "x *= -1"之间是否存在功能差异?

标签 c++ c multiplication negative-number

代码示例:

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 = -aa *= -1 等生成等效的最佳代码(可能是一条指令)。
    • 但尽管 MSVS 2012(优化?)对每条指令使用一条指令,= -a 需要 1 个周期,*= -1 需要 3 个周期。
  • 任何让它变得更快的尝试都会大大降低它的可读性,并且很容易让它变得更慢。
  • 如果您需要优化,您应该从分析生成的代码和性能开始。

副作用和冗余

然而,*= -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/

相关文章:

c++ - LNK2038、MSVS2017 MAGMA成因列表

c++ - 对象创建时 SSE 访问冲突崩溃

c - 从 HTML 文件中提取纯文本

algorithm - 修改后的 baugh-wooley 算法乘法 verilog 代码不能正确乘法

java - 不使用 BigInteger 的 Karatsuba 算法

c++ - 右值构造函数没有被调用?

c - 赋值从 int 中生成指针 w/out a cast

Notepad++ 中的 C 函数名称突出显示

multiplication - 评估大多项式的最快算法

c++ - 当变量达到最大值时,unsigned int 的递增会导致未定义的行为吗