【问题标题】:The comma operator in a declaration声明中的逗号运算符
【发布时间】:2017-12-05 10:12:45
【问题描述】:

我正在编写一个 C++ 解析器(实际上是它的一小部分),但无法解释为什么在变量初始化中不允许使用逗号运算符。

int a = 1, 2; // throws a "Expected ';' at the end of declaration" compiler error
a = 1, 2; // assigns the result of the comma binary operator to the a (2)
int a = (1, 2); // does the same as above, because paren expression is allowed as an initializer

C++ 规范说您可以在变量声明中使用表达式作为初始值设定项。为什么不允许逗号二进制表达式,但允许所有其他表达式(具有更高优先级)? cppreference.com (http://en.cppreference.com/w/cpp/language/initialization) 说任何表达式都可以用作初始化器。

C++ 规范的第 8.5 节说初始化器只能包含赋值表达式。这是规定赋值是初始化中允许的最低优先级表达式的地方吗?

【问题讨论】:

  • 你讨厌编译器作者?解析此int i = 1, 2, j = 3; 时,它们会将它们留在哪里?
  • "这是规定赋值是初始化中允许的最低优先级表达式的地方吗?"是的。
  • @n.m.但是有什么理由不允许逗号表达吗?
  • 是的:为了消除与int i = 2, j = 3的歧义。
  • @n.m.哦,现在我明白了。谢谢!

标签: c++


【解决方案1】:

语言语法将初始值设定项中的逗号解释为以逗号分隔的声明子句,即以下形式:

int i = 2, j = 3;

为避免这种歧义,您需要将逗号表达式括在括号中。

来自[dcl.decl]:

[...]
init-declarator-list:
    init-declarator
    init-declarator-list , init-declarator
[...]

【讨论】:

  • 这意味着您不能使用逗号运算符作为初始值设定项,而必须使用括号表达式,并且允许括号表达式具有逗号子表达式。
  • @ElvissStrazdins - 当然,从语法的角度来看,这是真的。我会调整答案。
  • initializer-list 只能在braced-init-list中使用,所以这与我的问题无关。我问的是平等初始化器。
  • 让我再看看。但与此同时,您似乎已经知道如何解释标准中的语法定义,那么您为什么要问这个问题呢?
  • @ElvissStrazdins - 我明白了。好吧,FWIW,我已经用我认为现在正确的语法部分更新了我的答案:)
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2012-09-18
  • 2022-11-14
  • 2017-01-18
  • 2019-08-05
  • 2017-03-29
  • 1970-01-01
  • 2020-12-29
相关资源
最近更新 更多