C++ if 语句数学计算错误
C++ if statement math evaluation bug
我有一个我认为是数学错误的问题出现,我不完全理解为什么会发生这种情况。
if (mNextBottomIndex < mBlocks.size() - 1) {
if (mBlocks[mNextBottomIndex + 1]->getGlobalPosition().y >= -mBlocks[mNextBottomIndex + 1]->getHeight()) {
mBlocks[mNextBottomIndex + 1]->setAlpha(1.0f);
mNextBottomIndex++;
}
}
它在inner if statement
的评估中崩溃,因为mBlocks.size() = 0
和mNextBottomIndex = 3
(或mNextBottomIndex
等于任何数字> 0)。所以我的问题是,考虑到最后一句话中的变量,它是如何通过outer if statement
的?应用程序未在后台线程中处理这些变量,并且变量在outer if statement
之前和之后相同
我将外部if statement
更正为
if (mBlocks.size() != 0 && mNextBottomIndex < mBlocks.size() - 1) {
if (mBlocks[mNextBottomIndex + 1]->getGlobalPosition().y >= -mBlocks[mNextBottomIndex + 1]->getHeight()) {
mBlocks[mNextBottomIndex + 1]->setAlpha(1.0f);
mNextBottomIndex++;
}
}
而且它现在似乎没有崩溃。
mBlocks.size() 是一个无符号的整数。 如果从值为 0 的无符号 int 中减去 1,它将下溢为一个大的正数。
您还没有向我们展示mBlocks
的类型,但鉴于您正在调用std::vector
的size()
成员函数(或一些类似的 stdlib 容器;例如std::array
),返回类型为size_type
类型(来自std::vector::size
@ cpp首选项):
std::vector::size
size_type size() const;
它始终是一个无符号整数(来自std::vector
@ cpp首选项):
成员类型
。
size_type
无符号整数类型(通常std::size_t
)
当你从0
中减去1
时,你会在无符号类型中生成一个负数(在执行比较之前通过整数转换),该负数(对于这个负数-1
量级很小)将环绕成一个大的无符号整数,这将自然地将mNextBottomIndex < ...
谓词作为true
传递。
另请参阅以下内容:
- 如果为无符号变量赋值为负值,会发生什么情况?
- Andrew Koenig - 无符号算术:有用但棘手
相关文章:
- 我的字符计数代码计算错误.为什么
- 为什么 2 个双精度值之间的差值计算错误?
- C++ openmp 并行计算计算错误的结果
- Qt qreal计算错误
- C 并行矩阵乘法,计算错误
- Arduino计算错误 - 不应该时给出负值
- 当尺寸变大时,会出现矩阵计算错误
- C++ if 语句数学计算错误
- 浮点数的不准确导致计算错误
- 优化标志会导致计算错误
- Kahan求和算法在GCC编译时存在较大的计算错误
- 为什么在函数中传递参数时会出现算术计算错误
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- OpenGL漫射照明计算错误
- 具有参数计算错误的重载函数
- 我的程序中有计算错误吗
- 在C++中使用ceil函数时出现计算错误
- 模拟读数计算错误
- struct和time_t的计算错误
- Pow()计算错误