【问题标题】:More about for loops更多关于 for 循环
【发布时间】:2013-12-14 19:08:40
【问题描述】:

我正在测试一些代码,发现了一件奇怪的事情:

#include<stdio.h>
void main()
{int m,n;
  for(m=0, n=0; m<0,n<4; m++,n++)
  printf("hello\n");
 }

我的猜测是它不会打印,因为条件 m&lt;0 不满足。但我对此感到震惊:

输出

hello
hello
hello
hello

谁能解释一下这个结果。为什么不评估 m&lt;0 条件?

【问题讨论】:

  • 谷歌“逗号运算符”。 , 不是 &amp;&amp;
  • 另外,main() 返回int
  • @H2CO3 放 void 或 int 都没有关系。 试试看
  • @user689 C11 §5.1.2.2.1 p 1: "程序启动时调用的函数名为main。实现声明该函数没有原型。应定义为返回类型为int [...]"
  • @kninnug 很高兴知道这一点。我以错误的方式学习它。但是在像这样的简单程序中,使用 void(在 c 语言中)是合法的。

标签: c for-loop


【解决方案1】:

在 C(和许多其他语言)中,逗号运算符是二元运算符,它计算第一个操作数并丢弃结果,然后计算第二个操作数并返回第二个操作数的结果。

所以cond1, cond2 会评估这两个条件,但只有cond2 很重要。

如果您希望同时满足这两个条件,请使用cond1 &amp;&amp; cond2。 所以

for(m=0, n=0; m<0 && n<4; m++,n++)

【讨论】:

  • 所以要解决这个问题,我应该使用 && ?
【解决方案2】:

你的意思是m &lt; 0 &amp;&amp; n &lt; 4

, 运算符接受两个表达式,同时执行这两个表达式(即,为了潜在的副作用),但计算结果为 second 表达式的结果。所以m &lt; 0, n &lt; 4 评估m &lt; 0(它没有副作用,所以它可能不存在),丢弃值false,并返回n &lt; 4

【讨论】:

    【解决方案3】:

    它被评估但逗号运算符, 将丢弃条件m&lt;0 的效果。

    【讨论】:

      【解决方案4】:

      表达式m&lt;0 确实得到了求值,但由于comma operator,它的结果被丢弃,下一个表达式的结果:n&lt;4 被用于for 条件。

      如前所述:表达式m &lt; 0 &amp;&amp; n &lt; 4 也会计算两个子表达式,但只有当它们都为真时才返回真。

      【讨论】:

        猜你喜欢
        • 2012-01-07
        • 2019-02-10
        • 2021-04-25
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 2020-09-17
        • 1970-01-01
        • 2019-10-27
        相关资源
        最近更新 更多