双重否定的原因是什么 - ( - n)?

时间:2016-09-05 13:33:58

标签: c

我正在浏览一些遗留代码,而且我已经看过像

这样的内容
char n = 65;
char str[1024];
sprintf(str, "%d", -(-n));

为什么作者(不再在场)写的是-(-n)而不仅仅是n?不会--n足够吗?

1 个答案:

答案 0 :(得分:13)

首先要注意的是--n实际减少 n 1并使用 type {{评估新值1}};所以它对char做了一些非常不同的事情。 不要将代码更改为!

-(-n)-n执行一元否定,并且由于C的类型提升规则,也是n类型的表达式。进一步的否定集它恢复到原始值但保留了类型 int

所以int实际上是一种编写-(-n)的冗长方式,这通常是一种无操作方式,但在这种情况下它会转换{{>> +n 1}}到n

我怀疑作者正在防范错误的重构,他们担心参数的类型与格式说明符int不匹配。

但是在这个特定的情况下,无关紧要:%d会自动将sprintf类型提升为char,因此编写< / p>

int

如果是“真实”代码,还应考虑减小sprintf(str, "%d", n);缓冲区的大小,并考虑使用更安全的str变体。

(作为最后的注释,双重否定可以产生有符号整数类型的溢出,所以请谨慎使用。)