35

我正在定制我在互联网上找到的代码(它是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

for(;;)是什么意思?(这是一个 Arduino 程序,所以我猜它是用 C 语言编写的)。

4

4 回答 4

78
for(;;) {
}

功能上的意思

 while (true) {
 }

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

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

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

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

于 2013-04-19T20:39:29.610 回答
4

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

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

于 2013-04-19T20:42:09.090 回答
3

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

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

在代码中它看起来像:

while(true){

}
于 2013-04-19T20:42:25.640 回答
3

这是维基百科所说

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

for (;;)
//loop body

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

于 2017-02-16T15:55:43.443 回答