c – 后增量运算符的评估以什么顺序发生?

特定

std::vector<CMyClass> objects;
CMyClass list[MAX_OBJECT_COUNT];

这样做是明智的吗?

for(unsigned int i = 0; i < objects.size(); list[i] = objects.at(i++));

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

for(unsigned int i = 0; i < objects.size(); i++)
{
  list[i] = objects.at(i);
}
最佳答案
前者是未定义的行为.在函数调用objects.at之前或之后,没有指定是否对list [i]进行求值(为赋值的lhs提供左值).

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

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

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

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

转载注明原文:c – 后增量运算符的评估以什么顺序发生? - 代码日志