当前位置:  开发笔记 > 编程语言 > 正文

为什么argc是'int'(而不是'unsigned int')?

如何解决《为什么argc是'int'(而不是'unsignedint')?》经验,为你挑选了7个好方法。

为什么命令行参数计数变量(传统的"argc")是'int'而不是'unsigned int'?这有技术原因吗?

在尝试删除所有已签名的无符号比较警告时,我总是忽略它,但从未理解为什么它是这样的.



1> mjv..:

事实上,原始C语言默认情况下任何变量或参数都被定义为int类型,这可能是另一个因素.换句话说,你可以:

  main(argc, char* argv[]);  /* see remark below... */

而不是

int main(int argc, char *argv[]);

编辑:有效地,正如亚伦提醒我们的那样,非常原始的语法会是这样的

  main(argc, argv) char **argv {... } 

由于"原型"仅在稍后介绍.这大概来自于每个人都至少记录了至少10个小时追逐微妙(而不是那么微妙)类型相关的错误


实际上它应该是`main(argc,argv)char*argv {}作为内联参数声明和原型直到ANSI C才引入(啊啊 - 过去的好时光......我很高兴它们已经消失了)
@right,亚伦!我忘记了......在我们展示我们的年龄之前,我们最好停下来;-)

2> DigitalRoss..:

原因如下:

因为没关系

因为C最初没有unsigned关键字或无符号整数类型

因为C最初没有检查参数类型,甚至没有原型.
因此,通常的做法是甚至不声明int类型,因为这是默认值.

因为int从某种意义上来说,当时更重要.一切都是一个int.C部分来自一种甚至没有类型的语言.每一个varable都是a word,这是int最初的用途.

更新: 杰森S要求消息来源.我认为你可以从dmr的一篇论文中挖掘所有这些(除了"无关紧要"),这是在线的: C语言的发展.您可能需要在通常的位置查找早期语言BCPL和B.



3> rlbond..:

因为C是旧的,它从一开始就是这样设计的.现在改变它已经太晚了.


C*是*老.它*从一开始就是这样设计的.但我不得不同意最后一句话(尽管不足以进行下调).ISO可以很容易地为main添加第三个原型定义,但影响不大.实际上,实现者也可以自由添加其他主要原型 - 它在标准中明确提到.
@paxdiablo同意,标准可以而且应该在[谨慎]进化和改变.然而,在这个特殊情况下,这个未签名的argc是如何帮助世界和平的呢?

4> John Bode..:

这是用dmr自己的话来说C编程语言的历史.它没有明确说明(至少不是我给它的快速浏览),但最早的C版本不支持无符号类型.mjv关于隐式打字的观点int也是相关的.

编辑

贝尔实验室的链接已经被打破了一段时间:这是同一篇论文的替代链接.


B没有炭.也不是那个问题.它是无类型的.焦炭== == INT无效*

5> Eli Bendersk..:

另一个原因可能是无符号类型可能不便于迭代.例如,此代码段向下迭代:

for (size_t i = SIZE - 1; i >= 0; --i)
  ...

事实上,这是一个错误.当我在最后一次迭代中达到0时,它将直接进入4294967295(在32位机器上)并且循环不会终止.

出于这个原因,我个人觉得普通的int更方便迭代.for使用整数时,将循环从计数切换到倒计时时,您不必特别小心.



6> Adam Goode..:

在谷歌C++风格指南建议从未使用unsigned int,除非你有实际的位模式的工作类型.他们的理由也适用于C. 快速摘要系列:

... C的类型提升方案导致无符号类型的行为与人们预期的不同....不要使用无符号类型.

这可能不是C的原始创造者的想法,但谁知道‽


我不明白谷歌声称无符号类型的行为"出乎意料"(在上下文中必须意味着,比签名类型更意外).签名和未签名类型在一起使用时行为不端,一个将被提升为另一个的签名.因此,类型提升系统会导致所有整数类型"行为与预期的不同".

7> Greg Hewgill..:

作为您的警告问题的解决方案,您可以执行以下操作来禁止警告:

const unsigned int uargc = (unsigned int) argc;


是的,因为问题被标记为"c",我以为我会使用两者都有用的东西.
推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有