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中的逗号运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章