C++中selectedObjectIdx与vector.size()比较结果异常原因咨询
问题原因与解决方案
核心原因:有符号与无符号整数的隐式转换
selectedObjectIdx 是有符号整数类型(int),而 std::vector::size() 返回的是无符号整数类型(size_t)。在C++的比较运算中,当有符号数和无符号数混合运算时,会触发隐式类型转换:有符号数会被强制转换为无符号数。
- 当
selectedObjectIdx = -1时,转换为无符号的size_t后会变成该类型的最大值(比如64位系统下是18446744073709551615),这个值远大于scene.meshes.size()的1,因此selectedObjectIdx >= scene.meshes.size()会返回true。 - 当
selectedObjectIdx = 0时,转换为无符号数后还是0,0 >= 1不成立,所以返回false。
解决方法
显式转换无符号数为有符号数
将size()的结果强制转换为int(或对应有符号类型),避免隐式转换问题:selectedObjectIdx >= static_cast<int>(scene.meshes.size())注意:如果你的vector可能存储超过
int最大值的元素,建议使用ssize_t(C++17引入的有符号版本size_t)来定义selectedObjectIdx,避免溢出风险。重构判断逻辑
先判断未选中状态,再单独校验索引合法性,逻辑更清晰:if (selectedObjectIdx == -1) { // 处理未选中逻辑 } else if (selectedObjectIdx >= 0 && selectedObjectIdx < static_cast<int>(scene.meshes.size())) { // 处理合法选中逻辑 } else { // 处理索引越界的异常情况 }
内容的提问来源于stack exchange,提问作者hellwraiz
相关产品推荐
相关产品推荐

