赋值运算符不是序列点的任何好理由?

Let*_*_Be 21 c c++ sequence-points

有没有什么理由operator =不成为序列点?在C和C++中都有.

我很难想到一个反例.

Kar*_*tel 22

按要求:

在一般情况下,事情需要一个理由,一个序列点.他们并不需要一个理由成为一个序列点; 这是默认值.

例如,&&由于短路行为,必须是序列点:如果左侧为假,则不得评估右侧.(这不仅仅是关于优化;右侧可能有副作用,和/或取决于左侧是真的,如同ptr && ptr->data.)因此,左侧必须首先评估,在右侧之前 -手边,以便看看是否应该评估右侧.

这个原因之所以不存在是=因为,尽管双方都有"评价"(虽然对双方都有不同的限制:左手边必须是左值 - l不代表" left",btw;它代表"location",就像在内存中的位置 - 我们不能分配给临时或文字),首先评估哪一方并不重要 - 只要双方在之前进行评估实际的任务.

  • +1,但```不是一个序列点确实咬过我一次:我有'myArray [i ++] = <表达式包含i>;`,并且两个编译器中的一个在LHS之后计算了RHS,产生了错误回答.我最终的错,但仍然很棘手. (4认同)
  • 怎么样:`x = y [x] = 0`?在'x`设置为0之前,是否保证`y [x]`将评估(使用x的旧值)? (4认同)