括号表达式的赋值

时间:2015-01-26 23:45:37

标签: c expression

请考虑以下代码段:

int a, b, c;
a = (b = 3, c = 4, 5, 6);

事实证明,在执行这些行之后,b的值为3,c的值为4.到目前为止没有任何意外。但是a有价值6.为什么会这样?

此外,这有用吗?

2 个答案:

答案 0 :(得分:6)

因为,运算符会丢弃左边的所有操作数,并且因为6是最右边的操作数,所以它是唯一不被丢弃的操作数。

这是来自§6.5.17 n1570草案

  
      
  1. 逗号运算符的左操作数被计算为void表达式;有一个   其评估与右操作数之间的序列点。然后是正确的   操作数被评估;结果有其类型和价值。

  2.   
  3. 示例如语法所示,逗号运算符(如本子条款所述)不能   出现在上下文中,使用逗号分隔列表中的项(例如函数或列表的参数)   初始化者)。另一方面,它可以在带括号的表达式中使用,也可以在第二个表达式中使用   在这种情况下表达条件运算符。在函数调用

    f(a, (t=3, t+2), c)
    
         

    该函数有三个参数,第二个参数的值为5.

  4.   

您可以阅读更多here

答案 1 :(得分:0)

每当在赋值语句中使用分隔符(即',')时,它都会分配一个最后一个值。例如
    int i =(2,3);     // i = 3; 变量我得到3的值而不是2。