后增量算子的评估会以什么顺序发生?

sum*_*ame 3 c++ stl operator-precedence

特定

std::vector<CMyClass> objects;
CMyClass list[MAX_OBJECT_COUNT];
Run Code Online (Sandbox Code Playgroud)

这样做是明智的吗?

for(unsigned int i = 0; i < objects.size(); list[i] = objects.at(i++));
Run Code Online (Sandbox Code Playgroud)

或者我应该将循环扩展到此?

for(unsigned int i = 0; i < objects.size(); i++)
{
  list[i] = objects.at(i);
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*sop 11

前者是未定义的行为.没有指定是否list[i]在函数调用之前或之后对其进行求值(为赋值的lhs提供左值)objects.at.

因此,表达式的各个部分存在合法排序,其中i访问(in list[i])和单独修改(in i++),而没有中间序列点.

这正是C++标准中未定义行为的条件 - 是否存在这种合法排序.IIRC的C标准表达略有不同,但效果相同.

如果有疑问,请不要编写使用增量运算符的表达式,并在表达式中的任何其他位置使用相同的值.您可以使用逗号运算符(i++, i++很好)和条件运算符(i ? i++ : i--很好),因为它们中包含序列点,但它很少值得.||&&同样,让人觉得p != end_p && *(p++) = something;并非完全不可信.任何其他用途,如果你盯着它足够长的时间,你通常可以制定一个评估的命令,这会使事情变得混乱.

除了复杂for表达式和for具有空体的循环的可理解性之外.

  • @MSalters:坏点.这是未定义的.5/4说,"对于完整表达式的子表达式的每个允许顺序,应满足本段的要求,否则行为是__undefined__"(我的重点).提问者表达式的允许排序不符合要求,"只能访问先前值以确定要存储的值".出于某种原因,该段中的例子说行为是未指定的,我想在这些情况下,单独使用`i`作为左值不会使用`i`. (3认同)

ken*_*ytm 6

如有疑问,请选择易于理解的形式(扩展循环).

(我认为list[i] = objects.at(i++)导致未定义的行为.)