0
#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,则不会执行第二个语句。

4

4 回答 4

4

&&短路算子。

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

于 2017-05-22T13:04:26.323 回答
3

与您的问题无关,但请阅读C 和 C++ 中 main() 应该返回什么? int.


启用short circuit,并且&&是遵循它的运算符。所以这:

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

说:

  1. 递增x1。
  2. 如果x大于 2(因此 的第一个操作数&&为真),则计算第二个操作数。
  3. 第二个操作数表示递增y1,如果y > 2为真,则整个 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;
}
于 2017-05-22T13:05:39.893 回答
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=6Y=3
于 2017-05-22T14:26:22.053 回答
-1
if(++x > 2 && ++y > 2)

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

于 2017-05-22T13:06:36.870 回答