我偶尔注意到一些 C 代码坚持使用 0 - x
来获得 x
的附加补码,而不是编写 -x
。现在,我认为这些对于小于 int
的类型并不等效(edit:不,即使那时显然等效),但除此之外 - 前者有什么好处而不是后一种形式?
答案 0 :(得分:4)
0-x
可用于清除浮点零的符号。(正如@Deduplicator 在评论中指出的:)
我们中的许多人往往会忘记,在浮点类型中,我们有一个“正零”和一个“负零”值——打开和关闭符号位会留下相同的尾数和指数。阅读有关此 here 的更多信息。
好吧,事实证明这两个表达式在正号零上的表现不同,在负号零上的表现相同,如下所示:
x 的值 |
0-x 的值 |
-x 的值 |
---|---|---|
-.0 |
0 |
0 |
0 |
0 |
-.0 |
所以,当 x
是浮点类型时,
0-x
。x
。对于整数类型应该没有关系。
另一方面,正如@NateEldredge 指出的,由于整数提升,表达式在小整数类型上应该是等效的 - -x
转换为 x
的提升为 {{ 1}},然后应用减号。
答案 1 :(得分:3)
今天没有技术上的理由这样做。至少不是整数。至少不是一个理智的(根据某些任意定义)编码器会使用的方式。当然,它可能会导致演员阵容。我实际上不是 100% 确定,但在这种情况下,我会使用显式强制转换来清楚地传达意图。
正如 M.M 所指出的,在 K&R 时间是有原因的,当时 =-
等价于 -=
。这导致 x=-y
等价于 x=x-y
而不是 x=0-y
。这是不良影响,因此删除了该功能。
今天,原因是可读性。特别是如果您正在编写数学公式并想指出参数为零。一个例子是距离公式。 (x,y) 到原点的距离是 sqrt(pow(0-x, 2), pow(0-y, 2))