我会在C17中新定义i = i ++吗?

asy*_*nts 11 c operator-precedence sequence-points language-lawyer c17

在遇到问题" 为什么这些构造使用前后增量未定义的行为? "之后,我决定抓住最新的草案,为我能找到的下一个C标准,并阅读更多相关内容.
在我在C17草案中发现以下段落后不久:

表达式是操作符和操作数的序列,其指定值的计算,或指定对象或函数,或者生成副作用,或执行其组合.在运算符结果的值计算之前对运算符的操作数的值计算进行排序
来源:ISO/IEC 9899:2017,第6.5.1节"表达式"

现在我有点困惑.这i = i++是不是意味着定义了行为?我这次看了另一个草案,C99:

表达式是操作符和操作数的序列,其指定值的计算,或指定对象或函数,或者生成副作用,或执行其组合.
资料来源:ISO/IEC 9899:1999,第6.5.1节"表达式"

它错过了那句话!

问题

  1. 我误解了什么吗?
  2. 答案是否过时了?
  3. 我看错了选秀吗?

dbu*_*ush 7

您突出显示的段落仅表示表达式i++i在评估完整表达式之前进行评估i = i++.它仍然是未定义的行为,因为i在没有序列点的表达式中被多次修改.

该段落首次出现在C11中,所以C17版本没有变化.

  • @asynts正确。在分配方面,右侧没有任何副作用。 (2认同)