为什么命令行参数计数变量(传统的"argc")是'int'而不是'unsigned int'?这有技术原因吗?
在尝试删除所有已签名的无符号比较警告时,我总是忽略它,但从未理解为什么它是这样的.
事实上,原始C语言默认情况下任何变量或参数都被定义为int类型,这可能是另一个因素.换句话说,你可以:
main(argc, char* argv[]); /* see remark below... */
而不是
int main(int argc, char *argv[]);
编辑:有效地,正如亚伦提醒我们的那样,非常原始的语法会是这样的
main(argc, argv) char **argv {... }
由于"原型"仅在稍后介绍.这大概来自于每个人都至少记录了至少10个小时追逐微妙(而不是那么微妙)类型相关的错误
原因如下:
因为没关系
因为C最初没有unsigned
关键字或无符号整数类型
因为C最初没有检查参数类型,甚至没有原型.
因此,通常的做法是甚至不声明int
类型,因为这是默认值.
因为int
从某种意义上来说,当时更重要.一切都是一个int.C部分来自一种甚至没有类型的语言.每一个varable都是a word
,这是int
最初的用途.
更新: 杰森S要求消息来源.我认为你可以从dmr的一篇论文中挖掘所有这些(除了"无关紧要"),这是在线的: C语言的发展.您可能需要在通常的位置查找早期语言BCPL和B.
因为C是旧的,它从一开始就是这样设计的.现在改变它已经太晚了.
这是用dmr自己的话来说C编程语言的历史.它没有明确说明(至少不是我给它的快速浏览),但最早的C版本不支持无符号类型.mjv关于隐式打字的观点int
也是相关的.
编辑
贝尔实验室的链接已经被打破了一段时间:这是同一篇论文的替代链接.
另一个原因可能是无符号类型可能不便于迭代.例如,此代码段向下迭代:
for (size_t i = SIZE - 1; i >= 0; --i) ...
事实上,这是一个错误.当我在最后一次迭代中达到0时,它将直接进入4294967295(在32位机器上)并且循环不会终止.
出于这个原因,我个人觉得普通的int更方便迭代.for
使用整数时,将循环从计数切换到倒计时时,您不必特别小心.
在谷歌C++风格指南建议从未使用unsigned int
,除非你有实际的位模式的工作类型.他们的理由也适用于C. 快速摘要系列:
... C的类型提升方案导致无符号类型的行为与人们预期的不同....不要使用无符号类型.
这可能不是C的原始创造者的想法,但谁知道‽
作为您的警告问题的解决方案,您可以执行以下操作来禁止警告:
const unsigned int uargc = (unsigned int) argc;