【问题标题】:Condition in a 'for' loop“for”循环中的条件
【发布时间】:2010-11-26 01:02:30
【问题描述】:

我正在试验什么可以放入 C 中的 for 循环声明中以及如何使用它。我尝试了以下方法:

#include <stdio.h>

int stupid(int a)
{
    if(a == 3)
        return 1;
    else
        return 3;
}

int main(void)
{
    int i, j;
    for(i=0; stupid(i)==3,i<10; i++)
        printf("%d\n", i);
    return 0;
}

当我运行程序时,它只打印从 1 到 10 的数字,如果我在 stupid(i)==3i&lt;10 之间使用 &amp;&amp; 而不是逗号,那么程序只会打印最多 3 的数字。为什么?

我不太明白这是如何工作的,我希望循环传递所有数字并“跳过”3,但继续到 10,但这并没有真正发生。为什么会这样?是否有一些网站可以更清楚地解释这一点?

【问题讨论】:

  • 如果要跳过三个,必须在printf前面加上if (i != 3)。循环将在检测到i == 3 时立即终止,否则不会跳过其中的所有函数。我不完全确定这是否能回答您的问题。
  • 是的,我知道,但我想以某种方式将条件放入 for 循环声明中。
  • 您可以将 iffor 放在同一行,并且只有一组大括号 - 实际上是一个 for 循环,有条件地跳过某些项目而不退出。但是,在您的情况下,无论如何,您在循环中只有一个语句。您仍然需要if 来跳过特定项目而不停止循环,但是如果没有大括号,您将看不到单个块构造的视觉外观。
  • 如果你想在 for 循环中使用它,它应该是这样的:for(i=0;i&lt;10;i += (i == 2 ? 2 : 1)) printf("%d\n",i);。请注意,这是可怕的,如果你曾经把它交给家庭作业,原则上我会让你失望。

标签: c for-loop


【解决方案1】:

for 循环中的第二个子句(在您的情况下为 stupid(i)==3,i&lt;10)是在循环主体的每个条目之前评估的条件。如果计算结果为true,则执行循环体。如果计算结果为false,则循环结束并在循环体之后继续执行。

使用逗号 (stupid(i)==3,i&lt;10),代码计算 stupid(i)==3,忘记结果,然后计算 i&lt;10,并将该结果用于循环条件。所以你得到了从 0 到 9 的数字。

stupid(i)==3 &amp;&amp; i&lt;10 只有当表达式的两个部分都为真时才会计算为true,所以当i=3stupid(i)==3 为假时,循环退出。

【讨论】:

    【解决方案2】:

    逗号运算符计算逗号之前的部分,丢弃结果,计算逗号之后的部分,然后返回。因此,在您的 for 循环中,逗号后的部分是 i for 循环的条件返回的内容。这就是为什么如果你有逗号运算符,它会打印数字 1 到 10。

    如果你把&amp;&amp;运算符放在里面,则意味着&amp;&amp;之前和之后的条件都必须满足。否则循环终止。因此,如果 i == 3 左侧部分的计算结果为 false 并且您的循环结束。

    【讨论】:

      【解决方案3】:

      逗号运算符计算两者,但随后整体返回其第二个操作数的值。由于stupid() 没有任何副作用,这意味着这里实际上并没有发生太多的用处,您总体上只是检查i&lt;10 是否。

      当您将其更改为 &amp;&amp; 时,两个函数都必须返回 true(非零)才能继续迭代。在语句评估为 false 的第一次遍历中,for 循环停止并且控制继续通过它。

      【讨论】:

        【解决方案4】:

        for 循环只有在满足条件时才会继续。如果您在 for 循环中放置一个 if 语句来验证愚蠢(i) 是否等于 3,则 for 循环将继续。

        【讨论】:

          【解决方案5】:

          使用, 运算符可扩展到正在运行的每一行。最后一行应返回一个布尔表达式,指示是否应执行下一次迭代。

          在这种情况下,虽然确实调用了 stupid(),但它只检查表达式 i &lt; 10 的返回值以决定进一步执行。

          【讨论】:

            【解决方案6】:

            for循环中,需要三个表达式,用分号隔开。

            第一个是初始化器,它在循环开始前运行一次。它通常初始化循环变量。

            第二个是条件,它在初始化器之后运行,然后在每次后续迭代之前运行。如果为真,则运行循环语句。如果为假,则循环结束。

            第三个是在每次迭代之后和在下一次迭代之前检查条件之前运行的表达式。它通常通过改变循环变量来推进循环。

            您的条件stupid(i)==3,i&lt;10 使用逗号运算符。逗号运算符运行每一侧,但它只返回右侧的值。 stupid(i)==3 的值被完全忽略。条件stupid(i)==3 &amp;&amp; i&lt;10只有在双方都为真时才为真。

            记住,当条件为假时,循环结束——迭代不仅仅是跳过,整个循环结束了。要得到你想要的,请使用

             for(i=0; i < 10; ++i) {
                if (stupid(i)==3) {
                   printf("%d\n",i);
                }
             }
            

            这将经历 0-9,但如果 stupid(i) 不是 3,则跳过代码。

            【讨论】:

              【解决方案7】:

              用途:

              int main(void)
              {
                  int i,j;
                  for(i=0; i<10; i++, i+=i == 3)
                      printf("%d\n", i);
                  return 0;
              }
              

              限制条件on只能在条件成立时终止循环,不能跳过迭代。如果你想跳过一些值,你必须在for()的计数部分做,或者用if()做这个。

              i 变为 3 时,i+=i==3 将 1 加到 i,因为如果满足条件,i==3 计算为 1,否则计算为 0(加 0 根本没有任何区别)。

              【讨论】:

                【解决方案8】:

                如果您将 for 循环计数器值设为全局并在愚蠢(i)==3 时将 i 分配给 4,则您可以使用此逻辑跳过 3。以下是修改后的代码。我在Dev-C++上执行了它

                #include <stdio.h>
                
                int i, j;
                int stupid(int a)
                {
                    if(a==3) 
                        i=4;
                    else 
                        return 3;
                }
                
                int main(void)
                {
                    for(i=0; stupid(i)==3,i<10; i++) 
                        printf("%d\n", i);
                    return 0;
                }
                

                【讨论】:

                  【解决方案9】:

                  for 循环中的逗号充当 OR 运算符。如果任一语句的计算结果为真,则循环停止执行。

                  【讨论】:

                  • 这是不正确的。如果你写 for(int i = 0; true, false; i++) 循环将立即结束,因为“true”被丢弃并返回“false”。逗号运算符是 NOT 一个 OR。
                  • 没有。对第一个表达式求值,然后是第二个表达式。总表达式列表的结果是最后一个表达式的结果,所以无论愚蠢(i)返回逗号表达式的结果都是 i
                  • 这不是真的。逗号评估左侧,忽略该值,然后评估右侧并返回。 OR 计算双方,如果其中一方为真,则返回真。
                  • @Lou:“OR 评估双方” - 仅在必须时。它会短路。
                  猜你喜欢
                  • 2018-01-24
                  • 2016-04-10
                  • 2019-06-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-09-21
                  • 2018-06-26
                  相关资源
                  最近更新 更多