Cat*_*kul 62 c c++ command-line
为什么命令行参数计数变量(传统的"argc")是'int'而不是'unsigned int'?这有技术原因吗?
在尝试删除所有已签名的无符号比较警告时,我总是忽略它,但从未理解为什么它是这样的.
mjv*_*mjv 51
事实上,原始C语言默认情况下任何变量或参数都被定义为int类型,这可能是另一个因素.换句话说,你可以:
main(argc, char* argv[]); /* see remark below... */
Run Code Online (Sandbox Code Playgroud)
而不是
int main(int argc, char *argv[]);
Run Code Online (Sandbox Code Playgroud)
编辑:有效地,正如亚伦提醒我们的那样,非常原始的语法会是这样的
main(argc, argv) char **argv {... }
Run Code Online (Sandbox Code Playgroud)
由于"原型"仅在稍后介绍.这大概来自于每个人都至少记录了至少10个小时追逐微妙(而不是那么微妙)类型相关的错误
rlb*_*ond 12
因为C是旧的,它从一开始就是这样设计的.现在改变它已经太晚了.
另一个原因可能是无符号类型可能不便于迭代.例如,此代码段向下迭代:
for (size_t i = SIZE - 1; i >= 0; --i)
...
Run Code Online (Sandbox Code Playgroud)
事实上,这是一个错误.当我在最后一次迭代中达到0时,它将直接进入4294967295(在32位机器上)并且循环不会终止.
出于这个原因,我个人觉得普通的int更方便迭代.for
使用整数时,将循环从计数切换到倒计时时,您不必特别小心.
作为您的警告问题的解决方案,您可以执行以下操作来禁止警告:
const unsigned int uargc = (unsigned int) argc;
Run Code Online (Sandbox Code Playgroud)