请考虑下面的代码,为什么将括号括在逗号分隔值列表中会改变分配?
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
为什么括号使逗号操作取最后的价值和没有括号它需要第一个价值?
在此先感谢。
请考虑下面的代码,为什么将括号括在逗号分隔值列表中会改变分配?
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
为什么括号使逗号操作取最后的价值和没有括号它需要第一个价值?
在此先感谢。
赋值的优先级高于逗号,因此您在第一种情况下得到的结果。你可以在这里找到整个operator precedence table。
为什么括号使逗号运算符取最后一个值而没有括号取其第一个值?
因为括号用于覆盖优先级。第一种情况隐含等价于:
(i = 1),2,3,4,5;
逗号从左到右评估,最右边的值是整个表达式的值。在这里阅读documentation。
逗号运算符具有从左到右的关联性。用逗号分隔的两个表达式从左到右进行评估。左操作数总是被评估,并且在评估右操作数之前完成所有副作用。
这是由于运算符优先级和评估顺序。 =
结合比,
和困难,我们可以弄清楚,下面两个表达式是相同的:
i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)
边注:逗号操作是他们全部的“最弱”运营商
为什么逗号操作得到我们的名单的最后一个值?
说得简单此符计算第一个操作数只丢弃它并移动到下一个,它结合左到右这意味着它会从左边开始,并继续朝行走正确的。
我在哪里可以阅读更多关于此主题的内容?
+1提的运算符优先级 – junix
+1尼斯解释,但真的很抱歉,选择花药的答案。 –
由于=
具有比,
一个更高的优先级(其具有最低的),首先是相同
(i = 1),2,3,4,5;
其分配到1
i
(i = 1
)然后评估表达式2
,3
,4
,和5
通过逗号运算符(整个表达式实际上导致5
,这是不使用)。在第二个,
(1,2,3,4,5)
括弧,因此它会=
之前首先被评估。它的结果是5
(最右边的表达式;这是逗号运算符的行为),然后将其分配给i
。
i = (1,2,3,4,5);
| |
\---------\--- results in 5 then is assigned to i
[这可有助于(http://en.wikipedia.org/wiki/Comma_operator)。检查这个页面上的'Examples'标题。 –
@Dayalrai,这不是一个帮助 – ar2015
@ ar2015我可以清楚地看到答案在于_Examples_部从提供的链接其中'I =(A,B)'和'I = A,B'进行了讨论。 –