为什么将括号括在逗号分隔值列表周围会改变赋值?
请考虑以下代码,
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
为什么括号使逗号运算符取最后一个值而没有括号则取第一个值?
提前致谢。
第一个相当于(i = 1),2,3,4,5;
这意味着逗号没有效果。 与括号一起使用时,它返回“逗号分隔列表”中的最后一个值
这完全归功于运算符优先级,您可以在此处查看表格
这是由于运营商的优先级和评估顺序。 =
更难绑定,
从中可以看出以下两个表达式是相同的:
i = 1,2,3,4,5 /* <- same as -> */ (i = 1),(2),(3),(4),(5)
旁注: 逗号运算符是它们的“最弱”运算符
为什么逗号运算符会产生列表的最后一个值?
简单来说,这个操作符只是为了丢弃它而移动到下一个操作数,它从左到右绑定,这意味着它将从左边开始,并继续向右走。
我在哪里可以阅读有关此主题的更多信息
- cppreference.com – C ++运算符优先级
- swansontec.com – C语言运算符优先级
因为=
具有比(具有最低值)更高的优先级,所以第一个与…相同
(i = 1),2,3,4,5;
它将1
分配给i
( i = 1
),然后通过逗号运算符计算表达式2
和5
(整个表达式实际上导致5
,未使用)。 在第二个,
(1,2,3,4,5)
括号,因此它将在=
之前首先进行评估。 它导致5
(最右边的表达式;这是逗号运算符的行为),然后将其分配给i
。
i = (1,2,3,4,5); | | \---------\--- results in 5 then is assigned to i
请参阅运营商优先级维基百科文章 。
赋值的优先级高于逗号,因此在第一种情况下得到的结果。 您可以在此处找到整个运算符优先级表 。
为什么括号使逗号运算符取最后一个值而没有括号它取第一个值?
因为括号用于覆盖优先级。 第一种情况隐含地等同于:
(i = 1),2,3,4,5;
逗号从左到右进行计算,最右边的值是整个表达式的值。 阅读此处的文档 。
逗号运算符具有从左到右的关联性。 用逗号分隔的两个表达式从左到右进行计算。 始终评估左操作数,并在评估右操作数之前完成所有副作用。