我刚刚在这个答案中发现了一条评论说iostream::eof在循环条件下使用"几乎肯定是错误的".我通常使用类似的东西while(cin>>n)- 我猜是隐式检查EOF,为什么检查eof显式使用while (!cin.eof())错误?
它与scanf("...",...)!=EOF在C中使用有何不同(我经常使用没有问题)?
C标准定义了许多下限/上限(转换限制),并强制实现应满足每个转换.为什么没有为数组大小定义这样的最小限制?以下程序将编译正常并可能产生运行时错误/段错误,并将调用未定义的行为.
int main()
{
int a[99999999];
int i;
for(i=0;i<99999999;i++)
a[i]=i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
可能的原因可能是在自动存储上分配了本地数组,它取决于分配的堆栈帧的大小.但为什么不像C定义的其他限制那样达到最小限度?
让我们忘记上面提到的未定义的情况.考虑以下:
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i]=i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面,是什么让我保证本地数组(尽管非常小)将按预期工作,并且不会因分配失败而导致未定义的行为?
虽然这种小型阵列的分配不太可能在任何现代系统上失败.但是C标准没有定义满足要求,编译器也没有(至少GCC没有)报告分配失败.只有运行时错误/未定义的行为才有可能.困难的部分是没有人能够判断任意大小的数组是否会因分配失败而导致未定义的行为.
请注意,我知道我可以使用动态数组(通过malloc和朋友)来实现此目的,并可以更好地控制分配失败.我更感兴趣的是为什么没有为本地数组定义这样的限制.此外,全局数组将存储在静态存储中,并将增加编译器可以处理的可执行文件大小.