【问题标题】:Comma operator in c [duplicate]c中的逗号运算符[重复]
【发布时间】: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。

标签: c comma-operator


【解决方案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) 因为这是两个独立的语句。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 2018-03-30
      • 1970-01-01
      • 2017-07-11
      • 2010-12-16
      • 2020-12-31
      • 2012-10-30
      • 2017-05-27
      相关资源
      最近更新 更多