我正在查看一些遗留代码,我看到了类似的东西
char n = 65;
char str[1024];
sprintf(str, "%d", -(-n));
为什么作者(不再在场)写了-(-n)
而不仅仅是n
?不会--n
够了吗?
首先要注意的是--n
实际上减少 n
加 1 并计算出新值,其中type char
;所以它做了一些非常不同的事情-(-n)
. Don't将代码更改为该内容!
-n
执行一元否定n
也是类型的表达式int
因为类型推广C 的规则。进一步的否定将其设置回原始值,但type int
保留。
So -(-n)
实际上是一种冗长的书写方式+n
,这通常被认为是一个无操作,但在这种情况下它会转换type of n
to an int
.
我怀疑作者正在防止错误的重构,他们担心参数类型与格式说明符不匹配%d
.
但在这个特别的情况没关系:sprintf
会自动推广char
键入int
,所以写起来是完全安全的
sprintf(str, "%d", n);
还请考虑减小尺寸str
缓冲区(如果那是“真实”代码),并考虑使用更安全的snprintf
变体。
(最后要注意的是,双重否定可能会产生有符号整数类型溢出,因此请谨慎使用。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)