2013-07-15 25 views
18

请考虑下面的代码,为什么将括号括在逗号分隔值列表中会改变分配?

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); 

输出:

我第一次= 1

我第二次= 5


为什么括号使逗号操作取最后的价值和没有括号它需要第一个价值?

在此先感谢。

+0

[这可有助于(http://en.wikipedia.org/wiki/Comma_o​​perator)。检查这个页面上的'Examples'标题。 –

+0

@Dayalrai,这不是一个帮助 – ar2015

+0

@ ar2015我可以清楚地看到答案在于_Examples_部从提供的链接其中'I =(A,B)'和'I = A,B'进行了讨论。 –

回答

20

第一个相当于(i = 1),2,3,4,5;这意味着逗号不起作用。在使用括号使用它返回的“逗号分隔的列表”

的最后一个值这一切都是由于运算符优先级,您可以查看表约here

+0

同意,但为什么最后的价值? –

+2

@pranitkothari因为逗号具有最低的运算符优先级和括号组在一起。逗号运算符具有从左到右的关联性。 – Rapptz

+0

清除了我的疑惑。 +1 –

4

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

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

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

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

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

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

8

这是由于运算符优先级和评估顺序。 =结合比,和困难,我们可以弄清楚,下面两个表达式是相同的:

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

边注:逗号操作是他们全部的“最弱”运营商


为什么逗号操作得到我们的名单的最后一个值?

说得简单此符计算第一个操作数只丢弃它并移动到下一个,它结合左到右这意味着它会从左边开始,并继续朝行走正确的。


我在哪里可以阅读更多关于此主题的内容?

+1

+1提的运算符优先级 – junix

+1

+1尼斯解释,但真的很抱歉,选择花药的答案。 –

5

由于=具有比,一个更高的优先级(其具有最低的),首先是相同

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

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

(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

相关问题