【问题标题】:Two semicolons inside a for-loop parenthesesfor循环括号内的两个分号
【发布时间】:2013-04-19 20:38:47
【问题描述】:

我正在自定义我在互联网上找到的代码(它是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 语言编写的)。

【问题讨论】:

标签: c parsing for-loop syntax arduino


【解决方案1】:
for(;;) {
}

功能上的意思

 while (true) {
 }

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      在代码中是这样的:

      while(true){
      
      }
      

      【讨论】:

        【解决方案4】:

        这是维基百科Says关于它的内容

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

        for (;;)
        //loop body

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

        【讨论】:

          猜你喜欢
          • 2022-12-05
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多