【问题标题】:How does for(i=0; i<5; x=(i++,a++)) work [duplicate]for(i=0; i<5; x=(i++,a++)) 如何工作[重复]
【发布时间】:2014-09-17 09:44:21
【问题描述】:

我不明白它是如何工作的以及它产生的原因 以下输出。

int main()
{
    int i=0;
    int a=5;
    int x=0;

    for(i=0; i<5; x=(i++,a++))
    {
        printf("i=%d a=%d x=%d\n",i,a,x);
    }
}

这作为输出:

i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8

【问题讨论】:

  • 查找逗号运算符。
  • this
  • 您不了解该程序的哪个特定部分?
  • 这绝对是写那个表达式的糟糕方式,i++, x = a++ 做同样的事情并且不暗示 x 和 i 之间有任何关系
  • 程序运行正常。由于您没有说出您的预期,因此无法回答您的问题。

标签: c comma-operator


【解决方案1】:

暂时忘记++,它们只是一种干扰。

int a = 5;
int i = 0;    
int x = (i, a);

x 的值设置为5。评估并丢弃i,然后评估a 并将其分配给x

在你的循环中,后增量a++ 会做它一直做的事情;返回当前值,然后递增变量。所以x在增加之前取a的值,然后a的值增加1。因为i++也被评估了,所以它的值也增加了。

【讨论】:

    【解决方案2】:

    我想你理解这样的 for 循环:

    for(i=0; i<5; i++)
    

    您不妨增加两个变量;如果你用逗号分隔它们;像这样:

    for(i=0; i<5; i++,a++)
    

    在每个循环开始时,ia 都将递增。现在只需要解释表达式x=(i++,a++)x 获取分配的两个值中的最后一个。和写法一样:

    x=i++;
    x=a++;
    

    当然 a 是后递增的,所以首先将它的值分配给 x;然后才增加 a。

    【讨论】:

      【解决方案3】:

      很简单,您使用的两个运算符都是“后增量”,这意味着首先会发生赋值,然后会发生变量的增量。 让我们通过一个例子来理解, 假设,

      i=5
      x=i++;
      printf("%d", x)
      

      上面的代码将输出为 5

      i=5
      x=++i;
      printf("%d", x)
      

      这将输出为 6

      希望你理解其中的逻辑。

      【讨论】:

        【解决方案4】:

        逗号操作符的意思是:全部执行,返回最后一个值;

        例子:

        A = (b+=1,c+2,d+1);
        

        这句话将b加1,c加2(但不会修改),d加1。因此 d+1 是最后一个表达式 A 将被设置为其值。

        post 和 pre 运算符 ++ 很棘手。

        A++ 表示:返回 A 的值,然后将其递增。 ++A 意思是:增加A,然后返回它的值。

        所以如果 A=2

        b=A++; // set b to 2 and increments A one unity
        b=++A; // increments A to 4 and sets b to 4
        

        【讨论】:

          【解决方案5】:

          考虑您的示例和输出(除了我将 x 的初始值设为 22):

          int i=0;
          int a=5;
          int x=22;
          
          for(i=0; i<5; x=(i++,a++))
          {
              printf("i=%d a=%d x=%d\n",i,a,x);
          }
          

          打印:

          i=0 a=5 x=22
          i=1 a=6 x=5
          i=2 a=7 x=6
          i=3 a=8 x=7
          i=4 a=9 x=8
          

          请注意,x 具有循环之前的 x 初始值或上次循环中的前一个值。

          回想一下,任何for 循环都可以表示为等效的while 循环。

          for 循环:

          for(exp 1; exp 2; exp 3){
              expressions
          }
          

          相当于:

          exp 1;
          while(exp 2){
             expressions
             exp 3;
          }
          

          所以你的for 循环可以写成:

          int i=0;              // exp 1 from the for loop
          int a=5;
          int x=22;
          
          while(i<5){           // exp 2
              // loop body
              printf("i=%d a=%d x=%d\n",i,a,x);
          
              x=(i++,a++);      // exp 3 from the for loop
          }
          

          打印相同的输出。

          exp 3 在循环结束时被计算(无论是 for 循环还是 while 循环),这就是为什么 x 在循环体中有先前的 x 值。

          最后要考虑的是comma operator。表达式:

          i=(a+=2, a+b)
             ^^^               evaluate a then add 2
                 ^             comma operator in this case
                    ^^         add b to a
          
           ^                   store the final expression -- the RH of the comma operator -- 
                               into i
          

          【讨论】:

          • +1 很好的详细答案。 离题您个人资料中的引用重复使用了“are”这个词;)
          • @TomFenech:谢谢!将“你是”改为“你是”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 2011-07-27
          • 2019-11-07
          • 1970-01-01
          相关资源
          最近更新 更多