对于2个变量的循环

时间:2018-03-07 14:36:56

标签: c for-loop

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

说我有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个变量,而我想为我的两个变量应用所有内容

2 个答案:

答案 0 :(得分:3)

  

这有什么原因吗?或者我只是做错了?

它确实有效,但不是你预期的方式:

a < 10 , b < 6评估a < 10,然后评估b < 6,但这是b < 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;
    }
}

答案 1 :(得分:2)

这几乎可行,但是你的停止条件是错误的。它需要像a < 10 && b < 6或类似的东西,具体取决于你想要的东西。

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