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具有空体的循环的可理解性之外.
| 归档时间: |
|
| 查看次数: |
1570 次 |
| 最近记录: |