为什么将括号括在逗号分隔值列表周围会改变赋值?

时间:2013-07-15 07:10:49

标签: c++ c syntax

请考虑以下代码,

    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


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

提前致谢。

4 个答案:

答案 0 :(得分:21)

第一个相当于(i = 1),2,3,4,5;,这意味着逗号无效。与括号一起使用时,它将返回"逗号分隔列表中的最后一个值"

这完全归功于运营商优先级,您可以查看有关here

的表格

答案 1 :(得分:9)

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

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

旁注:逗号运算符是它们中“最弱”的运算符


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

简单地说,这个操作符只计算第一个操作数以丢弃它并移动到下一个操作数,它将从左到右绑定,这意味着它将从左边开始,并且继续走向右边。


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

答案 2 :(得分:5)

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

  

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

因为括号用于覆盖优先级。第一种情况隐含地等同于:

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

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

  

逗号运算符具有从左到右的关联性。用逗号分隔的两个表达式从左到右进行计算。始终评估左操作数,并在评估右操作数之前完成所有副作用。

答案 3 :(得分:5)

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

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

1分配给ii = 1),然后评估表达式234和{{1}通过逗号运算符(整个表达式实际上导致5,未使用)。在第二个,

5

是括号,因此它将在(1,2,3,4,5) 之前首先进行评估。它导致=(最右边的表达式;这是逗号运算符的行为),然后将其分配给5

i

请参阅operator precedence Wikipedia article