【问题标题】:Is the comma in a variable list a sequence point?变量列表中的逗号是序列点吗?
【发布时间】:2011-09-18 19:59:21
【问题描述】:

在以下类型的代码中,每个变量构造之间是否存在序列点,或者结果未定义?

int a = 0;
int b = a++, c = a++;

我无法在标准中找到对此处序列点的特定引用。这是否意味着它未定义,或者只是我的搜索失败?表达式的完成是一个序列点,但是上面的初始化也算吗?

【问题讨论】:

  • @Mark:正确,逗号是分隔符,在那种情况下不是运算符。 更新:马克去哪儿了? :-S 我冒险猜测,因为它是一个分隔符,所以它肯定是一个序列点,但我急切地等待一个权威的答案。
  • 既然这种普遍认为是不好的做法,为什么要担心它。只需将每个声明放在单独的语句中即可。
  • @Martin:我有时发现它对于一次性创建变量和指向它的指针很有用,尤其是在类型名很长的情况下:MyVeryLongType::subclass::foo<Bar>::type x, * px = &x;...
  • 我总是做for(iterator b = begin(), e = end(); ..) 这样的事情,我认为这很好。只是不要在初始化程序中产生副作用。
  • @Kerrek SB:使用两行代码(不要偷懒)。您几乎会发现,任何有编码指南的公司都会强迫您重新编写它(习惯它)。正如 litb 提到的那样,它唯一被容忍的地方是 for(;;) ,它被普遍接受为可以(但永远不要做你所做的事情)。

标签: c++ variables comma sequence-points


【解决方案1】:

我相信由于8[dcl.decl]/3

,行为是明确定义的

声明中的每个 init-declarator 都被单独分析,就好像它本身在声明中一样。

这甚至在脚注中额外解释为

一个包含多个声明符的声明通常等价于相应的声明序列,每个声明只有一个 声明者。那是

T D1, D2, ... Dn;

通常等价于

T D1; T D2; ... T Dn;

【讨论】:

  • +1:这个词通常意味着它们可能不等价,例如,在这种情况下:struct S{}; S S, A;(不等价于格式错误的S S; S A;
  • +1,但请注意,这只是蛋糕的一半。只有 8p3 和 1.9px 似乎完全回答了这个问题(人们仍然可以争辩说“int a = i++;int b = i++;”是 UB,因为缺少序列点,如果它不是 1.9px 来禁止这个论点) .因此我 +1 @Alan 和你的回答。
【解决方案2】:

您怀疑每个初始化表达式之后都有一个序列点,因为它们是完整的表达式(1.9/16、1.9/12)。

【讨论】:

  • 您能否补充一下OP的示例是否等同于int b = a++; int c = a++;更新: 没关系,Cubbi 的回答很到位。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 2018-05-27
  • 2020-08-15
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多