【问题标题】:What do multiple increments mean in a for loop?for循环中的多个增量是什么意思?
【发布时间】:2015-08-17 20:21:26
【问题描述】:

我正在阅读代码,我遇到了这段代码:

for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr)

我应该如何解释它? for 循环是否有多个增量?我以前见过多个条件,用逗号分隔,但我以前从未见过多个增量。

【问题讨论】:

标签: c for-loop


【解决方案1】:

是的,最后两个表达式将在每次循环迭代后执行。

【讨论】:

    【解决方案2】:

    看看comma operator。基本上,for 的增量部分由带有逗号运算符的表达式组成。所以你的假设是正确的。

    【讨论】:

      【解决方案3】:

      在这种情况下,在循环的每次迭代中,都会调用两个语句。它似乎是某种链表。如果你把它写成一个while循环,你可以清楚地看到它是如何工作的:

      p = prevp->s.ptr;
      while (true) {
          //Loop body here
      
          prevp = p;
          p = p->s.ptr;
      }
      

      【讨论】:

        【解决方案4】:

        for 循环具有以下格式:

        for( <initialization>; <condition>; <recurring operation> ) ....
        

        &lt;initialization&gt; 发生在第一次进入循环之前(如果有的话)。
        &lt;recurring operation&gt; 在每次迭代之后执行
        &lt;condition&gt; 在每次迭代之前都会进行检查。

        在您的情况下:
        &lt;initialization&gt; = p = prevp-&gt;s.ptr - 将 p 初始化为某个指针值
        &lt;condition&gt; = 没有。所以循环将永远运行,除非有 break 语句或其他一些流控制表达式打破遇到的循环。
        &lt;recurring operation&gt; = prevp = p, p = p-&gt;s.ptr。它在这里更新了两个变量prevpp,这样在下一次迭代中它们都将具有新值。逗号运算符是从左到右计算的,因此首先更新prevp,然后更新p

        【讨论】:

        • 你确定这是for循环的正确格式吗?
        • @banach-space 如果您扩大一点,您的评论会更有帮助。不过没关系,我已经想通了。正在更新答案中
        • 我想你会自己想办法的 ;-)
        【解决方案5】:

        for 语句的正式语法是:

        for ( clause-1 ; expression-2 ; expression-3 ) statement
        

        clause-1expression-2expression-3 中的任何一个都可以使用 comma operator 在其中允许多个表达式。

        clause-1中,可以初始化多个变量。

        for ( cp1 = s1, cp2 = s2; ...
        

        expression-3 中,您可以更改多个变量。

        for ( cp1 = s1, cp2 = s2; ...; ++cp1, ++cp2 )
        

        在您的情况下,expression-3prevp = p, p = p-&gt;s.ptr

        【讨论】:

        • expression 2 只允许一个表达式。
        • @hacks,不正确。您也可以使用逗号运算符在那里有多个表达式。这将是非常难看的代码,但语法允许它。请参阅ideone.com/3I0Vy2
        • i &lt; 10, j &lt; 20; 会破坏使用逗号运算符的目的。
        • @hacks,我同意。这只是一个快速而肮脏的黑客行为,以表明它是合法的。
        【解决方案6】:

        在此声明中 -

        for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) 
        

        实际上并没有多重增量。在 for 循环的开头,我们看到 p = prev-&gt;s.ptr,它实际上是 p 的初始化。

        然后放在for循环中的代码就会被执行。

        然后评估condition 部分。这里没有条件。所以循环继续,除非它从 for 循环的代码块内部中断。

        到达for循环的增量部分。现在previous 指向pp 点将采用下一个值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-11
          • 1970-01-01
          • 1970-01-01
          • 2014-02-18
          • 2019-03-09
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多