for循环括号内的两个分号

时间:2013-04-19 20:38:48

标签: c parsing for-loop syntax arduino

我正在定制我在互联网上找到的代码(它是Adafruit Tweet Receipt)。我无法理解代码的许多部分,但最令我困惑的是括号内有两个分号的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中。)

4 个答案:

答案 0 :(得分:58)

for(;;) {
}

在功能上意味着

 while (true) {
 }

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

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

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

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

答案 1 :(得分:2)

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

在你的情况下for(;;)意味着它将永远循环,因为条件不存在。循环在代码returnbreak s。

时结束

答案 2 :(得分:2)

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

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

在代码中看起来像:

while(true){

}

答案 3 :(得分:2)

这里有什么维基百科Says关于它

  

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

     

for (;;)
     //loop body

     

使用此样式而不是无限while(1)循环来避免某些C / C ++编译器中的类型转换警告。一些程序员喜欢更简洁的for(;;)形式而不是语义上相同但更冗长的{{{ 1}}形式。