为什么命令行参数数量变量(传统上是argc
)是int
而不是unsigned int
?这背后是否有技术原因?
当我试图消除所有签名无符号比较警告时,我总是忽略了它,但从未理解过它为什么是这样。
为什么命令行参数数量变量(传统上是argc
)是int
而不是unsigned int
?这背后是否有技术原因?
当我试图消除所有签名无符号比较警告时,我总是忽略了它,但从未理解过它为什么是这样。
原始的 C 语言默认情况下将任何变量或参数定义为 int 类型,这可能是另一个因素。换句话说,你可以有:
main(argc, char* argv[]); /* see remark below... */
与其
int main(int argc, char *argv[]);
编辑:正如Aaron提醒我们的那样,最初的语法实际上应该是类似于下面这样的:
main(argc, argv) char **argv {... }
由于“原型”是在稍后才引入的。那大约是在每个人都至少花费了10小时追踪微妙(或不那么微妙)与类型相关的错误之后。
char
和int
之外还有其他类型,并且每个函数都返回一个int
。 - Earlzfor (size_t i = SIZE - 1; i >= 0; --i)
...
实际上,这是一个错误。当在最后一次迭代中i达到0时,在32位机器上它会继续增加到4294967295,循环不会终止。
因此,我个人发现使用普通的整数更方便进行迭代。使用整数时,当你从计数变为递减计数时,不必特别小心。
for (size_t i = SIZE - 1; i < SIZE; i--)
,然后就完成了。;) 来源:https://gustedt.wordpress.com/2013/07/15/a-praise-of-size_t-and-other-unsigned-types/ - alx - recommends codidactGoogle C++ Style Guide建议除非你正在使用实际的位模式,否则永远不要使用unsigned int
类型。他们的理由也适用于C语言。简单概括一下:
...... C的类型提升机制导致无符号类型的行为与人们的预期不同...... 不要使用无符号类型。
这可能不是C语言最初创建者的想法,但谁知道呢‽
const unsigned int uargc = (unsigned int) argc;
c
,我认为我可以使用适用于两种语言的东西。 - Greg Hewgill将C程序更轻松地移植到Java中是一个有远见的设计决策,因为Java中没有无符号类型。
我知道这看起来很奇怪:argc
不应该是负数!但从另一个角度看:如果你有 2^31 个命令行参数,那么 int
和 unsigned int
都可以覆盖你接受的值范围,而且 int
更短。
面试谜题问题:如果 C 采用了 unsigned int argc
,会使用多少个键盘?
main(argc, argv) char* argv { }
的形式(啊 - 那些美好的过去...我很高兴它们已经过去了)。 - Aaronmain(argc, argv) char **argv {... }
,但见过/使用过main(argc, argv) int argc; char* argv; { ... }
。 - chux - Reinstate Monica