c中的逗号运算符[重复]

Posted

技术标签:

【中文标题】c中的逗号运算符[重复]【英文标题】:Comma operator in c [duplicate] 【发布时间】:2018-02-20 23:15:10 【问题描述】:
#include<stdio.h> 
int main(void) 
   int a;
   a = (1, 2), 3; 
   printf("%d", a);
   return 0;

输出:2 谁能解释一下输出是2吗?

【问题讨论】:

您能解释一下您在编写代码时的期望吗?这不像把语句和表达式放在一起,代码应该是有意义的。你想达到什么目标? @Olaf 要回答这个问题,不必知道 OP 期望什么。只需解释导致结果“2”的机制(如果您想努力并回答它) @Olaf 这个问题显然不是关于调试的,而是关于主题的 @Olaf OP 很好奇,为什么 C 会这样。运算符优先级在这里是一个问题,我不认为大多数优秀的 C 书籍都描述了这种特殊情况。这既不是调试也不是“太宽泛”,而是试图理解这个(非平凡的)构造是如何工作的。我不同意,这是一个用勺子喂食的问题。 @Olaf 我不同意。即使在期待结果时,您也可能想知道“如何”或“为什么”。我以前没有见过这个案例,觉得很有趣。在此处同意 Ctx。 【参考方案1】:

谁能解释一下输出是2吗?

因为赋值运算符=)的优先级高于逗号运算符,)。

因此,声明:

a = (1, 2), 3;

相当于:

(a = (1, 2)), 3;

而表达式(1, 2) 的计算结果为2

【讨论】:

@Olaf 哦,是的,它确实回答了这个问题:这意味着a 被分配了表达式(1, 2) 的值,即2, 3 与分配无关。 @cmaster:我没有看到任何迹象表明 OP 假设 3。他也可以期待1。这有不同的原因。 嗯,有时答案应该在引导和喂食之间找到正确的平衡...... @Gam 重读表达式(a = (1, 2)), 3:执行赋值的子表达式甚至不包含3。这样就清楚了吗? @cmaster 哦,是的,对不起,我现在明白了!变量取值 2(这里 1 没用),然后计算表达式“3”,但它什么都不做也没关系【参考方案2】:

谁能解释一下输出是2吗?

在声明中

a = (1, 2), 3;   

, 使用的是comma operator。 由于= 运算符的运算符优先级高于, 运算符,表达式操作数(1, 2) 将绑定到=

(a = (1, 2)), 3;  

在逗号运算符的情况下,逗号运算符的左操作数被计算为 void 表达式,然后计算右操作数,结果具有右操作数的值和类型

这里有两个逗号运算符。对于表达式 (1, 2) 中的第一个逗号运算符,1 将被评估为 void 表达式,然后 2 将被评估并分配给 a。 现在a 的副作用已经发生,因此第二个逗号运算符3 的右操作数将被计算,表达式(a = (1, 2)), 3 的值将是3

【讨论】:

【参考方案3】:

结果:

a = x, y     =>     x

a = (i, j)   =>     j

因此,如果我们有:

x = (1 , 2)

a = (1 , 2) , 3     =>     2

如here所说:

逗号运算符以某种方式分隔表达式(具有值) 类似于分号如何终止语句和序列 表达式被括在括号中,类似于序列 of 语句用大括号括起来: (a, b, c) 是一个序列 表达式,以逗号分隔,计算结果为最后 表达式 c 而 a;乙; c; 是一个语句序列,并且确实 不评估任何值。逗号只能出现在两个之间 表达式 – 逗号分隔的表达式 – 与分号不同, 出现在(非块)语句的末尾——分号 终止语句。

逗号运算符的优先级是所有 C 运算符中最低的,并且 充当序列点。在逗号和分号的组合中, 分号的优先级低于逗号,因为分号分开 语句,但逗号出现在语句中,符合 它们用作普通标点符号:a、b; c, d 分组为 (a, b); (c, d) 因为这是两个独立的语句。

我希望这能回答你的问题。

【讨论】:

以上是关于c中的逗号运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的运算符逗号?:条件

C ++ 11中的常量表达式中是不是允许逗号运算符?

逗号运算符有啥作用?

FOR循环中的逗号运算符,它是如何工作的?

C语言中逗号表达式的实用意义或者产生的原因?

c ++中的逗号运算符不计算第二个表达式