【问题标题】:Is (a = 0, a) + (a =1, a) undefined behaviour for int a?(a = 0, a) + (a =1, a) int a 的行为是否未定义?
【发布时间】:2021-05-20 11:29:56
【问题描述】:

int main()
{
    int a;
    int b = (a = 0, a) + (a = 1, a);
}

定义?如果在每个术语中没有, a,由于对a 的多次未排序写入,程序行为显然是未定义的,但是, 是否没有引入足够的排序点?

【问题讨论】:

  • @Answerers,请随意删除 language-lawyer 标签。
  • 否;括号分隔序列。 (而你得到的序列除了强化定义的行为部分之外什么都不做)。
  • 我们同意永远不要编写这样的代码,即使它是已定义的行为。
  • @Jabberwocky 好吧,特别是如果行为未定义;-)
  • 逗号运算符正好有 3 种用途: - 返回值的 icky 类似函数的宏 - 序列点语言律师辩论 - 代码高尔夫。

标签: c language-lawyer


【解决方案1】:

不,它没有明确定义。假设我们用伪代码“SQ”替换你代码中的所有序列点:

SQ
int b = (a = 0 SQ a) + (a = 1 SQ a) SQ

然后我们有SQ a) + (a = 1 SQ,其中两个访问和一个副作用发生在序列点之间的a,所以它仍然是未定义的行为。

我们可以像这样编写定义良好(但当然非常糟糕和可疑)的代码:

(0, a = 0) + (0, a = 1)

+ 操作数的计算顺序仍未指定,但编译器必须先计算任一括号,然后才能继续下一个。所以a的副作用/访问之间总是有一个逗号运算符序列点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 2015-11-16
    • 2014-09-24
    • 2017-01-21
    • 2013-08-24
    • 2013-04-24
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多