【问题标题】:What is meaning of y = x++ <= 2 in C?y = x++ <= 2 在 C 中是什么意思?
【发布时间】:2016-03-17 14:12:52
【问题描述】:

我在 C 语言中有以下代码 sn-p。

int main()
{
    int x = 1, y = 1;
    for( ; y ; printf("%d %d  ", x, y))
    {
        y = x++ <= 2;
    }
    printf("\n");
    return 0;
}

它给出类似的输出

2  1
3  1
4  0

我不明白y = x++ &lt;= 2 的输出和含义。

【问题讨论】:

    标签: c for-loop


    【解决方案1】:

    y = x++ &lt;= 2 由两部分组成:(1) x++ 和 (2) 赋值 y = ...

    x++ 仅表示后增量:您获取x 的值,然后将x 增加1

    assignment y = ... 会将 y 的值设置为 1(如果 x++ &lt;= 2 为真)或 0(如果 x++ &lt;= 2 为假)

    现在棘手的部分是你的for-loop

    for( ; y ; printf("%d %d  ", x, y))
    

    请注意,在您的for-loop 中,printf("%d %d ", x, y)(增量条件)将在每个循环之后打印

    并注意终止条件;y;,这意味着只要您的y is 1,您将保持在循环中。将它们结合起来,您会得到结果:

    2 1 3 1 4 0
    

    依次看起来像这样:

    //first x = 1, y = 1
    y = x++ <= 2; //x = 1 <= 2 returns 1, x++, x becomes 2, y becomes 1
    printf("%d %d  ", x, y)// you get your first 2 1
    y = x++ <= 2; //x = 2 <= 2 returns 1, x++, x becomes 3, y becomes 1
    printf("%d %d  ", x, y)// you get your 3 1
    y = x++ <= 2; //x = 3 <= 2 returns 0, x++, x becomes 4, y becomes 0
    printf("%d %d  ", x, y)// you get your 4 0
    

    【讨论】:

      【解决方案2】:
      y = x++ <= 2;
      

      相当于:

      if (x <= 2)
        y = 1;
      else
        y = 0;
      
      x++;
      

      【讨论】:

        【解决方案3】:
         y = x++ <= 2;
        

        此表达式检查是否 x&lt;=2 并将结果分配给 y 并增加 x 。随着后自增运算符x 的增加,但使用了它的原始值。

        如果 x&lt;=2y=1 否则 y=0 ,递增 x 并打印 xy ,直到 y 变为 0

        【讨论】:

          【解决方案4】:

          除了贴出的答案,请注意代码是一些人为的“笑话”代码。你不应该写那样的程序。除了一些学术上的运算符优先级练习之外,研究该代码并没有什么可学习的。

          存在以下问题:

          • 尽管 C 允许各种奇怪的事情,但 for 循环的第三个表达式应该只关注增加循环迭代器。因此,只有x++ 应该在那里,而不是一些 printf 语句。
          • 始终努力以最简单的规范形式编写循环,即for(int i=0; i&lt;n; i++)。这种形式是最易读的,通常也是产生最快代码的形式。
          • 与计算机打交道时,最好从0 开始计数。
          • 变量y 没有任何用途,只会增加混乱。
          • ++ 运算符最好不要与其他运算符混合,因为它包含副作用(更新变量)。和其他算子混用很容易出各种讨厌的bug。无论如何都没有理由这样做,您不会得到任何不同的机器代码。

          这是相同算法的等效的干净版本:

          #include <stdio.h>
          
          int main()
          {
            for(int x=0; x<3; x++)
            {
              printf("%d %d  ", x+2, x<2);
            }
            printf("\n");
            return 0;
          }
          

          (通过反汇编启用 gcc -O3 的两个 sn-ps 进行了双重检查,它们产生了完全相同的机器代码。)

          【讨论】:

            【解决方案5】:

            由于其他任何答案都没有完全解释这一点,我将在此处添加。在 C 中,有一个定义的operator precedence 用于处理运算符的处理方式。 y = x++ &lt;= 2; 使用了 3 个运算符:=++(post-increment)&lt;=

            具有立即计算的最高优先级运算符是&lt;= 运算符。 (从技术上讲,++ 运算符具有更高的优先级,但它对 x 的影响直到赋值发生后才应用。)我们可以添加括号来显示顺序:y = (x++ &lt;= 2);

            比较运算符的结果是C中的01(因为没有boolboolean类型),这意味着y将被分配0或@ 987654335@ 取决于比较的结果。

            在分配y 之后才会发生后缀递增操作。这意味着(x++ &lt;= 2) 的行为类似于(x &lt;= 2),这意味着x 的值之前将用于比较。

            如果我们分解这个陈述,我们可以展示它是如何被评估的。

            y = x++ <= 2;
            

            在功能上等同于:

            y = (x <= 2);
            x++;
            

            或者,说得更清楚(就像韦斯顿那样)

            if(x <= 2)
                y = 1;
            else
                y = 0;
            x++;
            

            理解这句话的关键是运算符优先级。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-10-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多