我正在检查一些遗留代码,我看到了类似的东西
char n = 65;
char str[1024];
sprintf(str, "%d", -(-n));
为什么作者(已不在)写的是 -(-n)
而不是 n
? --n
还不够吗?
最佳答案
首先要注意的是 --n
实际上减少 n
乘以 1 并求出新值,类型 char
;所以它做了一些与 -(-n)
非常不同的事情. 不要更改代码!
-n
对 n
执行一元否定也是 int
类型的表达式由于 C 的类型提升规则。进一步的否定将其设置回原始值,但类型 int
保留。
所以 -(-n)
其实是冗长的写法+n
,虽然通常是空操作,但在本例中它转换了 n
的 type到int
.
我怀疑作者是在防止错误的重构,他们担心参数类型与格式说明符 %d
不匹配。 .
但在这种特殊情况下,它并不重要:sprintf
会自动提升char
输入 int
, 所以写起来是绝对安全的
sprintf(str, "%d", n);
也请考虑减小 str
的大小如果那是“真正的”代码,请缓冲,并考虑使用更安全的 snprintf
变体。
(最后要注意的是,双重否定会产生有符号整数类型溢出,因此请谨慎使用。)
关于c - 双重否定-(-n)的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331791/