for循环括号内的两个分号

我定制了一个我在互联网上找到的代码(这是adafruit的推文收据)。 我无法理解代码的许多部分,但最令我困惑的是括号内有两个分号的for循环

boolean jsonParse(int depth, byte endChar) { int c, i; boolean readName = true; for(;;) { //<--------- while(isspace(c = timedRead())); // Scan past whitespace if(c < 0) return false; // Timeout if(c == endChar) return true; // EOD if(c == '{') { // Object follows if(!jsonParse(depth + 1, '}')) return false; if(!depth) return true; // End of file if(depth == resultsDepth) { // End of object in results list 

对(;;)意味着什么? (这是一个arduino程序所以我猜它在C中)

 for(;;) { } 

function意味着

  while (true) { } 

它可能会根据循环体内的某些条件打破循环/循环返回。

for(;;)永远循环的原因是因为for有三个部分, 每个部分都是可选的 。 第一部分初始化循环; 第二个决定是否继续循环,第三个在每次迭代结束时做一些事情。 它是完整的forms,你通常会看到这样的东西:

 for(i = 0; i < 10; i++) 

如果缺少第一个(初始化)或最后一个(迭代结束)部分,则不会执行任何操作。 如果缺少中间(测试)部分,那么就好像它的位置一样true 。 因此for(;;)for(;true;) '相同,其中(如上所示)与while (true)相同。

for循环有3个组件,由分号分隔。 第一个组件在循环开始之前运行,通常用于初始化变量。 第二个是条件。 在每次迭代开始时检查条件,如果它的计算结果为true,则循环中的代码运行。 第三个组件在循环结束时执行,在另一个迭代(从条件检查开始)开始之前,通常用于递增变量。

在你的情况下for(;;)意味着它将永远循环,因为条件不存在。 当代码return s或break时,循环结束。

for循环的每个子句都是可选的。 所以当它们被排除在外时,它仍然会循环。 for循环编译成while循环。

最终结果成为一个初始化任何变量的检查,它在没有任何事情发生之后结束,因为它是空的,检查第二个子句中的布尔条件,这不存在所以循环开始,并且一旦循环到达结束括号,在再次检查布尔条件之前检查是否有任何代码要运行。

在代码中它看起来像:

 while(true){ } 

这是维基百科所说的内容

用作无限循环
这种C风格的for循环通常是无限循环的来源,因为迭代的基本步骤完全在程序员的控制之下。 实际上,当意图使用无限循环时,可以使用这种类型的for循环(使用空表达式),例如:

for (;;)
//loop body

在一些C / C ++编译器中,使用这种样式代替无限while(1)循环以避免类型转换警告。一些程序员更喜欢for(;;)forms比语义等效但更冗长的while (true)forms更简洁。