加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:42:25 所属栏目:百科 来源:网络整理
导读:特定 std::vectorCMyClass 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] =
特定

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)=某事;并非完全不可信.任何其他用途,如果你盯着它足够长的时间,你通常可以制定一个评估的命令,这会使事情变得混乱.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读