代码之家  ›  专栏  ›  技术社区  ›  user288609

逗号运算符和赋值运算符-返回值

c c++
  •  4
  • user288609  · 技术社区  · 14 年前

    下面的代码段得到32的输出,我有点困惑为什么?

     int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 
    
    5 回复  |  直到 8 年前
        1
  •  12
  •   relet    14 年前

    开始阅读第一组括号内的内容。

    逗号运算符随后对几个表达式中的每个表达式进行计算。它返回最后一个表达式的返回值——在本例中,它是32,因为赋值的返回值是赋值的值。

    http://en.wikipedia.org/wiki/Comma_operator

        2
  •  4
  •   codaddict    14 年前

    这个 comma operator 是左关联的。

    它评估 j=4 然后 k=8 紧随其后 l=16 最后 m=32 返回32。因此我得到了 32 .

        3
  •  4
  •   Rich Adams    14 年前
    int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); // Will give you 32
    int i=(j=4,k=8,l=16); printf(“%d”, i); // Will give you 16
    int i=(j=4,k=8,l=16,m=32,n=64); printf(“%d”, i); // Will give you 64
    

    看到图案了吗?

    基本上, i 将被设置为大括号中最后一个赋值的值,因为 , 运算符将按顺序评估每个分配,但返回在上述情况下进行的最后一次分配的值。

    一般来说, , 操作员( comma operator )将按顺序计算一系列表达式,并返回最后一个表达式的值。所以在你的情况下, 正在分配最后一个大括号中分配的值(因为从分配返回的值是正在分配的值),即32。

        4
  •  2
  •   deepseefan    14 年前

    换句话说,括号中的任何内容都是先从左到右进行计算的;并且 返回最右边的表达式 作为括号的输出结果int,我得到十进制值32。

        5
  •  0
  •   R.. GitHub STOP HELPING ICE    14 年前

    不是真正的“答案”,但应该注意的是,逗号运算符的主要用途是在多个语句无效的上下文中,按顺序计算具有副作用的表达式,如函数调用、赋值等。最基本的用途是在宏中,您希望整个宏“返回值”,但执行多个操作。实现这一点的唯一其他方法是使用GCC ({ /* multiple statements here */ }) 扩展或让宏简单地调用 static / static inline 功能。

    我发现逗号运算符的另一个常见用法是 for 声明:

    for (n=cnt; n; n--, d++, s++)
    

    当我有一个 if 需要执行两个紧密连接操作的语句,我不希望大括号的视觉混乱:

    if (condition) prefix="0x", len=2;
    

    在后一种用法中,逗号运算符的结果值并不是特别有用,因此它并不重要,可能会让C初学者感到困惑。