C 通过+;检查for循环中的条件+;我
这里有一个C程序:C 通过+;检查for循环中的条件+;我,c,loops,C,Loops,这里有一个C程序: int main() { short int i = 0; for( ; ++i ; ) // <-- how this is checking condition printf("%u,", i); return 0; } intmain() { 短整数i=0; 对于(;++i;)/程序是错误的,因为它溢出了有符号的int,这在C中是未定义的行为。在某些环境中,它将导致无止境的循环,但许多编译器实现有符号溢出的方式
int main()
{
short int i = 0;
for( ; ++i ; ) // <-- how this is checking condition
printf("%u,", i);
return 0;
}
intmain()
{
短整数i=0;
对于(;++i;)/程序是错误的,因为它溢出了有符号的int,这在C中是未定义的行为。在某些环境中,它将导致无止境的循环,但许多编译器实现有符号溢出的方式与实现无符号溢出的方式相同
如果有符号溢出像无符号溢出一样实现,那么在某个点上,i
将变得太大,无法放入一个短的字符串中,并且将环绕并变为0-这将打破循环。基本上,USHRT\u MAX+1
产生0
因此,将i
更改为unsigned short i=0
,就可以了
for ( init, condition, inc )
你的“条件”是i++
。当i++
等于0时,它退出。短时间内,它发生得相当快
对(;;i++)做,
对于无止境循环实际上,OP中的条件是++i
,但这个答案在与环绕溢出结合时基本上是正确的。对不起,++i
和i++
在这里有相同的效果。对于“环绕”,可能值得一提的是,i
在到达0之前将是负数。它不会“环绕到0”,而是环绕到-32768。然后递增到0并停止。如果(++i)
与如果(++i)
不同,“可能值得一提的是,我在到达0之前将是负数”:您在等待什么?但是,将其更改为无符号整数将使其在更大的值处溢出。最后一行表示它将是无止境的?即使实现通过包装“实现”有符号溢出(这通常会自然发生,因为很难避免),编译器仍应将OP的代码优化为无限循环…尝试启用优化:-)