【问题标题】:Comma and assignment operators in CC中的逗号和赋值运算符
【发布时间】:2012-12-13 15:35:14
【问题描述】:

我有以下:

int a = 1, b = 2, c = 3, d = 4;
a = b, c = d;
printf("%d, %d, %d, %d", a, b, c, d);

输出是:

2, 2, 4, 4

逗号运算符如何与赋值运算符一起使用?据我所知,如果我们有,它将评估并返回第二个表达式,

(exp1, exp2)

那么,为什么它会评估a = b

【问题讨论】:

    标签: c c99 comma-operator


    【解决方案1】:

    计算第一个操作数并丢弃结果。然后计算第二个操作数,并将结果作为表达式的整体结果返回。

    标准说:

    逗号运算符的左操作数被评估为 void 表达;在它的评估和那个之间有一个序列点 的右操作数。然后评估右操作数;结果 有它的类型和价值。

    【讨论】:

    • 另外,赋值运算符还有一个副作用:它将右侧的值转换为左侧的类型,存储在左侧引用的对象中。因此,评估赋值会导致赋值被执行,即使赋值产生的值没有被使用。
    【解决方案2】:

    逗号运算符的优先级低于赋值。逗号运算符中的所有表达式都被计算,但只有最后一个被用作结果值。所以这两个任务都被执行了。在您的情况下,逗号运算符的结果将是 c = d 的结果。未使用此结果。

    【讨论】:

    • 你能证明结果如何使用吗?我尝试过这样的事情:x = a = b, c = d; 所以x 必须是4 对吗?
    • int e = (a=b, c=d);,例如。
    • x 在您的情况下为 2,因为赋值的优先级仍然高于逗号运算符。你需要括号,就像我的例子一样。
    【解决方案3】:

    逗号运算符计算它的两个操作数(首先是左边的)并返回右边的值。这并不特定于被赋值的操作数。

    【讨论】:

      【解决方案4】:

      它的工作方式与将它们编写为单个语句一样:

      int a = 1;
      int b = 2;
      int c = 3;
      int d = 4;
      
      a = b;
      c = d;
      

      更多详情,另请参阅Comma Operator

      来自维基百科:

      int a=1, b=2, c=3, i;   // comma acts as separator in this line, not as an operator
      i = (a, b);             // stores b into i                                                              ... a=1, b=2, c=3, i=2
      i = a, b;               // stores a into i. Equivalent to (i = a), b;                                   ... a=1, b=2, c=3, i=1
      i = (a += 2, a + b);    // increases a by 2, then stores a+b = 3+2 into i                               ... a=3, b=2, c=3, i=5
      i = a += 2, a + b;      // increases a by 2, then stores a into i. Equivalent to  (i = a += 2), a + b;  ... a=3, b=2, c=3, i=3
      i = a, b, c;            // stores a into i                                                              ... a=5, b=2, c=3, i=5
      i = (a, b, c);          // stores c into i  
      

      【讨论】:

        【解决方案5】:

        From what I have known it would evaluate and return the second expression

        这不是一个完全正确的说法。是的,第二个被评估并返回,但你暗示第一个被忽略。

        逗号运算符的工作方式是计算所有表达式并返回 last。例如:

        int a, b, c, d = 0;
        if(a = 1, b = 2, c = 3, d == 1)
            printf("No it isn't!\n")
        else
            printf("a: %d, b: %d, c: %d, d: %d\n", a, b, c, d);
        

        给你:

        a = 1, b = 2, c = 3, d = 0
        

        因为所有的表达式都被求值了,但只返回了d==1 来为条件做出决定。

        ...此运算符的更好用途可能是在for 循环中:

        for(int i = 0; i < x; counter--, i++) // we can keep track of two different counters
                                              // this way going in different directions.
        

        【讨论】:

          【解决方案6】:

          这段代码等价于:

          int a = 1;
          int b = 2;
          int c = 3;
          int d = 4;
          a = b;
          c = d;
          

          对逗号左边的第一个表达式求值,然后是它右边的表达式。最右边表达式的结果存储在 = 符号左侧的变量中。

          【讨论】:

            猜你喜欢
            • 2018-03-22
            • 1970-01-01
            • 1970-01-01
            • 2022-08-17
            • 2016-08-25
            • 2021-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多