Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么argc是';int';(而不是一个';无符号整数';)?_C++_C_Command Line - Fatal编程技术网

C++ 为什么argc是';int';(而不是一个';无符号整数';)?

C++ 为什么argc是';int';(而不是一个';无符号整数';)?,c++,c,command-line,C++,C,Command Line,为什么命令行参数计数变量(传统上是argc)是int而不是无符号int?这有技术上的原因吗 我总是在尝试删除我所有的有符号-无符号比较警告时忽略它,但我始终不明白为什么会这样。我想它是为了与C兼容而设计的,在C时代,人们并不真正关心有符号/无符号的正确性。因为C很旧,它从一开始就是这样设计的。现在更改已为时过晚。作为警告问题的解决方案,您可以执行以下操作来抑制警告: const unsigned int uargc = (unsigned int) argc; 我知道这看起来有多奇怪:argc

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


我总是在尝试删除我所有的有符号-无符号比较警告时忽略它,但我始终不明白为什么会这样。

我想它是为了与C兼容而设计的,在C时代,人们并不真正关心有符号/无符号的正确性。

因为C很旧,它从一开始就是这样设计的。现在更改已为时过晚。

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

const unsigned int uargc = (unsigned int) argc;

我知道这看起来有多奇怪:
argc
不应该是负数!但是从这个角度来看:
int
unsigned int
都涵盖了您可以接受的值的范围(如果您有2^31个命令行参数,您就有问题了),并且
int
的键入时间更短


采访难题问题:如果C与
无符号int argc
,输入
无符号
,会用掉多少个键盘?

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

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

int main(int argc, char *argv[]);
编辑:正如Aaron提醒我们的那样,最原始的语法应该是

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

因为“原型”只是后来才引入的。这大概是在每个人都记录了至少10个小时来追踪微妙的(不是那么微妙的)类型相关的bug之后。通过将其设置为int,范围被限制在1到int_MAX之间。这通常意味着不会有意外的施法或别名将其从意外环绕的范围中移除。它还允许实现对系统特定场景使用整个负值和0范围

好吧,这是我编的。真正的原因是,这只是一个原始的C语言开发人员做出的武断决定,直到现在还没有人真正认真考虑过这一点。:)

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

编辑


贝尔实验室的链接已经中断了一段时间:同一篇论文的另一个链接

一个简单的问题:您是否期望超过231个(甚至超过215个)命令行参数?我怀疑大多数操作系统都能处理这么多的问题。

这是一个有先见之明的设计决策,使将来将C程序移植到Java更容易,因为Java中没有未签名的类型。

原因如下:

  • 因为没关系
  • 因为C最初没有
    无符号
    关键字或无符号整数类型
  • 因为C最初没有检查参数类型,甚至没有原型。
    因此,通常不声明
    int
    类型,因为这是默认值
  • 因为从某种意义上说,
    int
    在当时更为重要。一切都是一种int.C语言,它的一部分是从一种甚至没有类型的语言演变而来的。每个变量都是一个
    word
    ,这就是
    int
    最初的用途
更新:询问来源。我认为你可以从一篇在线的论文中挖掘出所有这些(除了“没关系”): . 您可能需要在常用位置查找早期语言BCPL和B。

建议永远不要使用
无符号int
类型,除非您使用的是实际的位模式。它们的原理也适用于C。快速摘要行:

。。。C的类型提升方案导致未签名类型的行为与预期的不同。。。不要使用无符号类型


这可能不是C的原始创建者的想法,但谁知道呢?

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

for (size_t i = SIZE - 1; i >= 0; --i)
  ...
事实上,这是一个bug。当我在上一次迭代中达到0时,它将直接进入4294967295(在32位机器上),循环不会终止


出于这个原因,我个人认为普通整数更便于迭代。在使用ints时,将
for
循环从向上计数切换到向下计数时,您不必特别小心。

在将未签名类型添加到语言之前定义了
main()
的声明-请参阅DMR的“”页面。添加unsigned时,更改已经太晚了。

C可以将它们命名为int和uint,那么它就只多了一个字符。很好的答案;)像我一样think@Zan:我一直希望这是一个鲜为人知的秘密,大多数冗长的语言都是由键盘公司赞助的。我相信COBOL是由大写字母锁和Shift键设计师和工匠联合会支持的。实际上,它应该是“main(argc,argv)char*argv{}”因为内联参数声明和原型直到ANSIC才被引入(啊,过去的好日子…我很高兴他们走了)@对了,亚伦!我忘了。。。我们最好在年龄太大之前停下来;-)@Aaron没有看到
main(argc,argv)char**argv{…}
old-style函数定义,但看到/使用了
main(argc,argv)intargc;char*argv;{…}
你赢了我。是的,我不相信B(C的前身)除了
char
int
之外还有什么,而且每个函数都返回一个
int
B没有char。在那件事上也不是int。它是非类型化的。char==int==void*C是旧的。它从一开始就是这样设计的。但我