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

输出:

第一次 i = 1

第二次 i = 5


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

提前致谢。

4

4 回答 4

21

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

这都是由于运算符优先级,您可以在此处查看有关的表格

于 2013-07-15T07:13:37.217 回答
9

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

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

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


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

简单来说,这个操作符只对第一个操作数求值以丢弃它并继续下一个操作数,它从左到右绑定,意味着它将从左边开始,然后继续向右走。


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

于 2013-07-15T07:13:44.380 回答
5

赋值的优先级高于逗号,因此您在第一种情况下得到的结果。您可以在此处找到整个运算符优先级表

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

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

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

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

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

于 2013-07-15T07:13:11.193 回答
5

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

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

它分配1i( 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

请参阅运算符优先级 Wikipedia 文章

于 2013-07-15T07:13:50.207 回答