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

时间:2017-05-22 13:01:05

标签: c post-increment pre-increment and-operator

#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.

已解决:我不知道当有&amp;&amp;时,如果第一个语句的评估结果为false,则第二个语句将不会被执行。

4 个答案:

答案 0 :(得分:4)

&&短路运算符。

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

答案 1 :(得分:3)

与您的问题无关,但请阅读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为{} 是的,那么整个if条件都是真的。
  4. 您的代码与此相同:

    #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;
    }
    

答案 2 :(得分:1)

&&是短路运营商。

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

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

  1. k=0 X增加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
  4. k=3 X增加1时。现在X值为4X > 2是真的。因此Y将增加1。现在Y值为2。但Y > 2是假的。因此总条件为false
  5. k=4 X增加1时。现在X值为5X > 2是真的。因此Y将增加1。现在Y值为3Y > 2是真的。因此总条件是true。然后X会增加1
  6. 最终答案为 X = 6 Y = 3

答案 3 :(得分:-1)

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

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