【问题标题】:Why does putting parentheses around a list of comma separated values change the assignment? [duplicate]为什么在逗号分隔值列表周围加上括号会改变赋值? [复制]
【发布时间】:2013-07-12 23:34:44
【问题描述】:

请考虑以下代码,

    int i;

    i = 1,2,3,4,5;
    printf("First time i = %d\n",i);

    i = (1,2,3,4,5);
    printf("Second time i = %d\n",i);   

输出:

第一次 i = 1

第二次 i = 5


为什么括号使逗号运算符取最后一个值,而没有括号则取第一个值?

提前致谢。

【问题讨论】:

  • This may help。检查此页面上的 Examples 标题。
  • @Dayalrai,这不是帮助

标签: c++ c syntax


【解决方案1】:

第一个等价于(i = 1),2,3,4,5;,表示逗号无效。与括号一起使用时,它返回“逗号分隔列表”中的最后一个值

这都是由于运算符优先级,你可以查看一个关于here的表格

【讨论】:

  • 同意,但为什么最后一个值?
  • @pranitkothari 因为逗号的运算符优先级最低,括号将它们组合在一起。逗号运算符具有从左到右的关联性。
【解决方案2】:

这是由于运算符优先级和计算顺序。 =, 更难绑定,由此我们可以看出以下两个表达式是相同的:

i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)

旁注:逗号运算符是所有运算符中“最弱的”运算符


为什么逗号运算符会产生我们列表的最后一个值?

简单来说,这个运算符计算第一个操作数只是为了丢弃它并移动到下一个操作数,它绑定 left-to-right 这意味着它将从左边开始,并且继续向右走。


我可以在哪里阅读有关此主题的更多信息?

【讨论】:

  • +1 表示运算符优先级
  • +1 很好的解释,但很抱歉,选择花药作为答案。
【解决方案3】:

Assignment 的优先级高于 comma ,因此您在第一种情况下得到的结果。你可以在这里找到整个operator precedence table

为什么括号使逗号运算符取最后一个值,而没有括号则取第一个值?

因为括号是用来覆盖优先级的。第一种情况隐式等效于:

(i = 1),2,3,4,5;

逗号从左到右计算,最右边的值是整个表达式的值。在此处阅读documentation

逗号运算符具有从左到右的关联性。用逗号分隔的两个表达式从左到右求值。总是计算左操作数,并且在计算右操作数之前完成所有副作用。

【讨论】:

    【解决方案4】:

    因为= 的优先级高于,(后者最低),所以第一个与

    (i = 1),2,3,4,5;
    

    1 分配给i (i = 1) 然后通过逗号运算符评估表达式2345(整个表达式实际上导致@987654332 @,未使用)。在第二个中,

    (1,2,3,4,5)
    

    是带括号的,因此它将在= 之前首先被评估。它产生5(最右边的表达式;这是逗号运算符的行为),然后将其分配给i

    i = (1,2,3,4,5);
        |         |
        \---------\--- results in 5 then is assigned to i
    

    operator precedence Wikipedia article

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多