C 通过+;检查for循环中的条件+;我

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中是未定义的行为。在某些环境中,它将导致无止境的循环,但许多编译器实现有符号溢出的方式

这里有一个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的代码优化为无限循环…尝试启用优化:-)