代码之家  ›  专栏  ›  技术社区  ›  Catskul

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

  •  62
  • Catskul  · 技术社区  · 15 年前

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

    我总是在尝试消除所有已签名的、未签名的比较警告时忽略它,但始终不理解为什么它是这样的。

    13 回复  |  直到 9 年前
        1
  •  51
  •   mjv    15 年前

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

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

    而不是

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

    编辑 :实际上,正如Aaron提醒我们的那样,非常原始的语法应该是

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

    因为“原型”只是后来才推出的。这大概是在每个人都记录了至少10个小时来追踪与类型相关的细微(而不是如此细微)错误之后。

        2
  •  30
  •   Community CDub    7 年前

    原因有几个:

    • 因为没关系
    • 因为C原来没有 unsigned 关键字或 无符号整数类型
    • 因为C最初没有检查参数类型,甚至没有原型。
      因此,通常不申报 int 类型,因为这是默认值。
    • 因为 利息 从某种意义上说,当时更重要。所有的东西都是从一种甚至没有类型的语言进化而来的。每个varable都是 word 这是什么 int 最初用于。

    更新: Jason S 询问来源。我想你可以把这些(除了“没关系”)从报纸上挖出来 dmr 在线的: The Development of the C Language . 您可能需要在通常的地方查找早期的语言bcpl和b。

        3
  •  12
  •   rlbond    15 年前

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

        4
  •  11
  •   John Bode    9 年前

    Here's 用DMR语言编写C语言的历史。它没有明确地说明(至少不是从我给出的快速浏览中),但是C的早期版本不支持无符号类型。MJV关于隐式输入的观点 int 也是相关的。

    编辑

    贝尔实验室的链接已经断开一段时间了: here's 同一纸张的备用链接。

        5
  •  7
  •   Eli Bendersky    15 年前

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

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

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

    因此,我个人认为简单的ints对于迭代更为方便。当你切换到 for 使用ints时,从倒数到倒数循环。

        6
  •  6
  •   Adam Goode    15 年前

    这个 Google C++ Style Guide 建议不要使用 unsigned int 类型,除非您使用的是实际的位模式。他们的理论也适用于C。快速摘要行:

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

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

        7
  •  5
  •   Greg Hewgill    15 年前

    作为警告问题的解决方案,您可以这样做来抑制警告:

    const unsigned int uargc = (unsigned int) argc;
    
        8
  •  4
  •   Rob Walker    15 年前

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

        9
  •  3
  •   Jonathan Leffler    15 年前

    声明 main() 是在将未签名类型添加到语言之前定义的-请参阅上的dmr's page Primeval C '.添加未签名时更改为时已晚。

        10
  •  1
  •   Harold L    15 年前

    我知道这看起来很奇怪: argc 不应该是否定的!但是这样看:两者都是 int unsigned int 覆盖您要接受的值的范围(如果有2^31命令行参数,则会出现问题)和 int 短于类型。

    面试难题问题:有多少键盘会被用来打字 unsigned 如果C和 unsigned int argc ?

        11
  •  0
  •   Paul Hsieh    15 年前

    通过将其设置为int,范围限制在1和int_max之间。这通常意味着,任何意外的强制转换或别名都不会使其超出意外环绕的范围。它还允许实现将整个负范围和0范围用于特定于系统的场景。

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

        12
  •  0
  •   David R Tribble    15 年前

    只是一个简单的问题:你期望超过2个 三十一 (甚至超过2 十五 )命令行参数?我怀疑大多数操作系统都能处理这么多问题。

        13
  •  -2
  •   quant_dev    15 年前

    我认为它是为与C兼容而设计的,在C时代,人们并不太关心签名/未签名的正确性。