【问题标题】:For loop for 2 variables2个变量的for循环
【发布时间】:2018-08-15 16:57:51
【问题描述】:

我最近开始学习 C,我觉得这是一个不太聪明的问题,但是我想知道你是否可以获取 2 个变量,初始化它们,评估它们的条件并在 1 个 for 循环中递增它们

假设我有 2 个整数:a 和 b,我想初始化它们并增加它们。

for(a=1, b= 1; a < 10 , b < 6; a++, b++)
{
    printf("a= %d\n", a);
    printf("/tb= %d\n", b);
}

这不起作用有什么原因吗? 还是我做错了?

我查看了this question,但在其中他/她只想增加 2 个变量,而我想为我的两个变量应用所有内容

【问题讨论】:

  • a &lt; 10 , b &lt; 6 等价于b &lt; 6。你的意思是a &lt; 10 &amp;&amp; b &lt; 6
  • a &lt; 10 , b &lt; 6 => a &lt; 10 &amp;&amp; b &lt; 6 否则你只是在测试b 但是由于变量同时递增,有什么意义呢?
  • 它工作正常,你遇到什么错误。?
  • @EdHeal 我并没有暗示它是等价的。我的意思是要检查两个条件,你需要&amp;&amp; 而不是,
  • 巧合的是,将此特定条件从 a &lt; 10, b &lt; 6 更改为 a &lt; 10 &amp;&amp; b &lt; 6 将产生完全相同的输出。因为它们都从 1 线性增加。

标签: c for-loop


【解决方案1】:

这不起作用有什么原因吗?还是我做错了?

它确实有效,但与您预期的方式不同:

a &lt; 10 , b &lt; 6 评估 a &lt; 10 然后 b &lt; 6 但它是 b &lt; 6 返回的结果。所以你的循环只会到 5。

Comma oparator (wikipedia)

让我解释一下 for 循环的工作原理:

您有三个“段”,所有这些都是可选的

  • initialisation 这部分在循环开始之前运行一次
  • condition 这部分在每次迭代之前进行评估,如果此condition 评估为false,则循环退出。
  • increment每次迭代后执行。
for ( initialisation ; condition ; increment ) {
     /* body of the for loop */
}

您可以使用while 循环实现相同的语义:

initialisation;

while (condition) {
    /* body of the for loop */
    increment;
}

例如:

for (;1;) 永远不会退出,for (;0;) 永远不会运行。

要实现所需的行为,您可以这样做:

//1-9, and values of "b" which are 1-5
int a, b;

for (a = 1, b = 1; a <= 9; ++a, (b <= 4 ? ++b : 0)) {
    printf("a: %d\n", a);
    printf("b: %d\n", b);

    printf("\n");
}

但最好在 for 循环中执行此操作:

int a, b;

// This reads much better
for (a = 1, b = 1; a <= 9; ++a) {
    printf("a: %d\n", a);
    printf("b: %d\n", b);

    printf("\n");

    if (b <= 4) {
        ++b;
    }
}

【讨论】:

  • 非常感谢!但是如果我想要 a = 1 - 9 ( a=1, a=2.. ) 和 b = 1- 5( b= 1, b=, 我的条件可以是 "a
【解决方案2】:

这几乎可以工作,但是您的停止条件是错误的。它需要是 a &lt; 10 &amp;&amp; b &lt; 6 或类似的东西,这取决于你想要什么。

原因是comma operator的行为:只会返回逗号的正确语句。所以你的循环只会在b &lt; 6 时停止,忽略你的a &lt; 10 条件。循环的其他两个部分不依赖于返回的值,因此它们没有这个问题。

【讨论】:

  • 我在 "a
  • @skdadle:嗯,是的,a &lt; 10 &amp;&amp; b &lt; 6 将在 b 达到 6 时评估为 false,这发生在 a 达到 10 之前。根据您的描述,您想要一些东西像这样:for ( a = 1, b = 1; a &lt; 10; a++, b++ ) { printf( "a: %d\n", a ); if ( b &lt; 6 ) printf( "b: %d\n", b ); }。基本上,您在小于 10 时循环和打印 a,但在小于 6 时仅打印 b
猜你喜欢
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2022-01-26
  • 2015-09-26
  • 2017-11-14
  • 2021-01-02
  • 2017-06-20
  • 1970-01-01
相关资源
最近更新 更多