【问题标题】:How does this code produces an output of 6 and 3?这段代码如何产生 6 和 3 的输出?
【发布时间】:2017-10-22 03:40:51
【问题描述】:
#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,那么第二个语句将不会被执行。

【问题讨论】:

  • 你有什么不明白的地方?增量? if 语句?什么?
  • 使用调试器或printf查看每次迭代的每个变量的值。它将帮助您逐步了解它是如何工作的
  • 在循环中打印 k、x 和 y 并查看发生了什么
  • 谁 CVed 为 dup:不是!
  • 我撤回了我的投票.....不知道为什么没有。我投票决定重新开放

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


【解决方案1】:

&amp;&amp;短路 运算符。

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

【讨论】:

    【解决方案2】:

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


    启用 短路&amp;&amp; 是遵循它的运算符。所以,这个:

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

    说:

    1. x 增加 1。
    2. 如果x 大于2(因此&amp;&amp; 的第一个操作数为真), 计算第二个操作数。
    3. 第二个操作数表示将y 增加1,如果y &gt; 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;
    }
    

    【讨论】:

      【解决方案3】:

      &amp;&amp; 是短路运算符。

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

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

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

      【讨论】:

      • 我不喜欢这样的措辞:“第一个操作数为真,那么只有第二个操作数会被计算。”看起来你是说第二个操作数将被评估而第一个不会。我不是母语人士,但我认为您应该将其更改为“仅当第一个操作数为真时才会评估第二个操作数”以避免歧义(对于阅读此内容的任何母语人士,请告诉我是否我是正确的?)。或者,为了简单起见,我将其改写为“在这个if 语句中,只有当第一个操作数为真时,才会计算第二个操作数。”
      【解决方案4】:
      if(++x > 2 && ++y > 2)
      

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

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多