gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:00:29 25 4
gpt4 key购买 nike

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

char n = 65;
char str[1024];
sprintf(str, "%d", -(-n));

为什么作者(已不在)写的是 -(-n) 而不是 n--n 还不够吗?

最佳答案

首先要注意的是 --n实际上减少 n乘以 1 并求出新值,类型 char ;所以它做了一些与 -(-n) 非常不同的事情. 不要更改代码!

-nn 执行一元否定也是 int 类型的表达式由于 C 的类型提升规则。进一步的否定将其设置回原始值,但类型 int保留。

所以 -(-n)其实是冗长的写法+n ,虽然通常是空操作,但在本例中它转换了 ntypeint .

我怀疑作者是在防止错误的重构,他们担心参数类型与格式说明符 %d 不匹配。 .

但在这种特殊情况下,它并不重要:sprintf会自动提升char输入 int , 所以写起来是绝对安全的

sprintf(str, "%d", n);

也请考虑减小 str 的大小如果那是“真正的”代码,请缓冲,并考虑使用更安全的 snprintf变体。

(最后要注意的是,双重否定会产生有符号整数类型溢出,因此请谨慎使用。)

关于c - 双重否定-(-n)的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com