逗号运算符和逗号分隔符之间的区别是什么?

时间:2014-06-15 21:32:15

标签: c++ c++11 language-lawyer c++14

  • 在C ++中,逗号标记(即,)可以解释为逗号运算符逗号分隔符

  • 但是,在网上搜索时,我意识到在哪种情况下,令牌被解释为二进制逗号运算符并且其中被解释为语句之间的分隔符并不十分清楚

  • 此外,考虑到由,分隔的一行中的多个陈述/表达式(例如a = 1, b = 2, c = 3;),对它们的评估顺序存在浑浊。

问题:

  1. 在哪种情况下,逗号,令牌被解释为运算符,并在其中作为分隔符?
  2. 当我们有一行多个用逗号分隔的语句/表达式时,对于逗号运算符和逗号分隔符的大小写的评估顺序是什么?

2 个答案:

答案 0 :(得分:4)

当分隔符合适时 - 在函数调用或宏的参数中,或者在初始化列表中分隔值(感谢提醒,@ hack) - 逗号将被视为分隔符。在其他表达式中,它被视为运算符。例如,

my_function(a,b,c,d);

是一个将四个参数传递给函数的调用,而

result=(a,b,c,d);

将被理解为逗号运算符。通过丑陋的方式,可以通过编写像

这样的东西来混合两者
my_function(a,(b,c),d);

通常从左到右评估逗号运算符。

在C中最初使用此操作是为了允许宏在返回值之前执行多个操作。由于宏实例化看起来像函数调用,用户通常希望它可以在函数调用的任何地方使用;将宏扩展到多个语句会使其失败。因此,C引入了,运算符,允许将多个表达式一起链接到一个表达式中,同时丢弃除最后一个之外的所有表达式。

正如@haccks指出的那样,编译器如何确定,的含义的确切规则来自语言语法,并且之前已经在How does the compiler know that the comma in a function call is not a comma operator?讨论了

答案 1 :(得分:3)

您不能使用逗号分隔语句。 ,中的a = 1, b = 2;是逗号运算符,其参数是两个赋值表达式。逗号运算符的参数的评估顺序是从左到右,因此在这种情况下清楚评估顺序是什么。

在函数调用的参数的上下文中,这些参数不能是逗号表达式,因此顶级逗号必须是语法(即分隔参数)。在这种情况下,评估顺序是指定。 (当然,参数可能是带括号的表达式,带括号的表达式可能是逗号表达式。)

这在C ++标准的语法中清楚地表达出来。相关作品为expression,可以是:

assignment-expression

expression , assignment-expression

expression-list,与initializer-list相同,后者是<{1}}的分隔列表,其中initializer-clause是:

initializer-clause

assignment-expression

第二个braced-init-list作品中的是逗号运算符。