这段代码如何产生 6 和 3 的输出?

How does this code produces an output of 6 and 3?

#include<stdio.h>
void main() {
     int x = 0,y = 0,k = 0;
     for(k = 0; k < 5; k++){
         if(++x > 2 && ++y > 2)    x++;
     }
     printf("x = %d and y = %d",x,y);
}

我无法理解上面这段代码是如何生成 x = 6 和 y = 3 的。

已解决:我不知道当有 && 时,如果第一个语句的计算结果为 false,则不会执行第二个语句。

&& 是一个 短路 运算符。

第一次循环,只评估++x
第二次循环,只评估 ++x
第三次循环,两者都被评估。
...

与您的问题无关,但请阅读What should main() return in C and C++? int


启用 短路 ,并且 && 是紧随其后的运算符。所以,这个:

if(++x > 2 && ++y > 2)

说:

  1. x 增加 1。
  2. 如果x大于2(因此&&的第一个操作数为真), 计算第二个操作数。
  3. 第二个操作数表示将 y 递增 1,如果 y > 2 是 true,则整个 if 条件为真。

您的代码等同于:

#include <stdio.h>
int main() {
     int x = 0, y = 0, k = 0;
     for(k = 0; k < 5; k++){
         x = x + 1;
         if(x > 2)
         {
             y = y + 1;
             if(y > 2)
             {
                 x = x + 1;
             }
         }  
     }
     printf("x = %d and y = %d", x, y);
     return 0;
}
if(++x > 2 && ++y > 2)

在这一行中,如果第一个条件为假,则不会评估第二个条件。所以第一个条件为假,直到 x 的值为 3

&&为短路运算符

if ( ++x > 2 && ++y > 2 )

在此 if 语句中,仅当第一个操作数为真时,才会计算第二个操作数。

  1. k=0X 将递增 1。现在 x 值为 1x > 2 为假。所以Y不会增加。
  2. k=1 X 将递增 1 。现在 X 值为 2X > 2 为假。所以Y不会增加。
  3. k=2 X 将增加 1 时。现在 X 值为 3X > 2 是真的。所以 Y 将增加 1 。现在 Y 值为 1 。但是 Y > 2 是 false 。所以如果条件是 false.
  4. k=3 X 将递增 1 。现在 X 值为 4X > 2 是真的。所以 Y 将增加 1 。现在 Y 值为 2 。但是 Y > 2 是 false 。所以如果条件是 false.
  5. k=4 X 将递增 1 。现在 X 值为 5X > 2 是真的。所以 Y 将增加 1 。现在 Y 值为 3Y > 2 是真的。如果条件为 true,那么总计。然后 X 将递增 1.
  6. 最后的答案是X=6Y=3