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

2024-02-24

我正在查看一些遗留代码,我看到了类似的东西

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(使用前将#替换为@)

双重否定-(-n)的原因是什么? 的相关文章

随机推荐