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

标签 c

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

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/

相关文章:

关于c中的free(指针)的困惑

在 Visual Studio 2012 中编译 GTK3 程序

c - pthread_cancel() 是否有可能终止另一个意外的线程?

c - strtok 分配给数组结构失败

c - 为什么我的程序不存储第一个用户指定的输入?

C Devoweler内存错误

c - 在结构的末尾添加 'structure identifier' 是多余的吗?它有什么用?

c - Xcode 上的 Jansson

c - 当非静态函数声明跟在静态函数声明之后会发生什么?

不能分配超过一百万个整数