我正在阅读一些遗留代码,我已经看到了类似的东西
char n = 65; char str[1024]; sprintf(str, "%d", -(-n));
为什么作者(不再存在)写-(-n)
而不是n
? 不会 – 还不够?
首先要注意的是--n
实际上将 n
减 1并计算为新值, 类型为 char
; 所以它做了一些非常不同的事情-(-n)
。 不要将代码更改为!
-n
执行n
的一元否定,并且由于C的类型提升规则也是int
类型的表达式。进一步的否定将其设置回原始值但保留类型 int
。
所以-(-n)
实际上是一种冗长的写入+n
,这通常是一种无操作,但在这种情况下它将n
的类型转换为int
。
我怀疑作者正在防范错误的重构,他们担心参数的类型与格式说明符%d
不匹配。
但在这种特殊情况下并不重要: sprintf
会自动将char
类型提升为int
,所以写它是绝对安全的
sprintf(str, "%d", n);
如果是“真正的”代码,还要考虑减小str
缓冲区的大小,并考虑使用更安全的snprintf
变体。
(作为最后的注释,注意双重否定可以产生有符号整数类型的溢出,所以请谨慎使用。)
以上就是c/c++开发分享双重否定的原因是什么 – ( – n)?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562486.html