为什么这个未定义的行为?

McC*_*Coy 5 c++ undefined-behavior sequence-points

为什么以下给定的表达式会调用未定义的行为?

int i = 5;
i = (i,i++,i) + 1 
Run Code Online (Sandbox Code Playgroud)

我的问题在这里受到Als问题的影响

Ste*_*sop 11

它没有未定义.

这里回答C,序列点和部分顺序

我认为同样适用于C++(在我看到该链接之前,这是我的回复):

逗号运算符引入了一个序列点(并在某种程度上约束了表达式必须被评估的顺序 - 在右边之前),因此:

  • 两个修改i由序列点(第二个逗号)分隔.
  • iin 的修改i++通过序列点与其他所有内容分开.
  • 的修改i=不是从最后一次出现分离i的表达,但没关系,因为我们可以访问i和修改,而不会插入顺序点,提供访问是"确定要存储的值"( 5/4).
  • 正如Als所说,在实践中,如果每个人都有基本的常识不写,那么代码是否定义了行为并不重要;-)