【问题标题】:what functionality does comma hold here,why it doesn't evoke compile time error? [duplicate]逗号在这里有什么功能,为什么它不会引起编译时错误? [复制]
【发布时间】:2019-01-13 11:45:59
【问题描述】:

代码sn-p:

#include <stdio.h>
int computeSum(int number1, int number2) {
    int sum;
    sum = number1 + number2;
    return sum;

}
int main()
{
      int sum = 0,k=0;

      k,sum= computeSum(4,2);
      printf("%d %d",sum,k);

     return 0;
}

k 之间的逗号 ( , ) 有什么作用 总而言之,为什么它不会引起任何错误?它的意义是什么?

【问题讨论】:

  • 只是语法错误。你想达到什么目的?
  • @DenisSablukov 为什么你认为这是错误的?我认为这只是分隔两个表达式的逗号运算符。左边的表达式只是k,右边的表达式是(仅)求和的赋值。 (特别是,没有分配给k)。
  • @DenisSablukov "逗号运算符的左操作数被计算为 void 表达式;在它的计算和右操作数的计算之间有一个序列点。然后计算右操作数;结果有它的类型和价值。” (来自 n1570 草案,6.5.17)
  • @PeterA.Schneider 我的错。不知道..

标签: c comma


【解决方案1】:

准确地说,逗号运算符在一般表达式中的含义

e1 , e2

计算子表达式e1,然后计算e2;表达式的值是e2 的值。

当你用gcc编译器编译你的程序时,它会给出警告信息:

warning: left-hand operand of comma expression has no effect
k,sum= computeSum(4,2);
^

原因是,表达式

k,sum= computeSum(4,2);

先计算子表达式k,然后再计算sum= computeSum(4,2);。子表达式k 结果未使用。

【讨论】:

    【解决方案2】:

    您使用的一个逗号运算符,在表达式 k 和赋值表达式之间,只是将两个表达式组成一个表达式,并对它们进行排序。

    当然,第一个表达式没有效果thus the compiler warns you(如果你要求的话):

    prog.c: In function 'main':
    prog.c:12:8: warning: left-hand operand of comma expression has no effect [-Wunused-value]
       12 |       k,sum= computeSum(4,2);
          |        ^
    

    【讨论】:

      【解决方案3】:

      k,sum= computeSum(4,2);只需获取k的值然后赋值sum

      也许你想做k = sum = computeSum(4,2);

      赋值是一个返回值的表达式,而不是像if ...这样的语句

      【讨论】:

      • 你确定它在语法上无效?
      • 这是非常有效的语法。它在这里没有做任何有用的事情。
      • 是的,是的,我想说这不是他想做的,我的英语不好,对不起
      • 即使我现在投了赞成票,但您可能需要重新考虑“赋值是表达式,而不是语句”:表达式可以是语句,恰当地命名为“表达式语句”(n1570 6.8.3) .
      • @PeterA.Schneider 我想说a = if ... 是不允许的,是的,表达式也是先表达式的陈述……怎么说更好?
      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多