C++ if 语句数学计算错误

C++ if statement math evaluation bug

本文关键字:计算 错误 if 语句 C++      更新时间:2023-10-16

我有一个我认为是数学错误的问题出现,我不完全理解为什么会发生这种情况。

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() = 0mNextBottomIndex = 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::vectorsize()成员函数(或一些类似的 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 - 无符号算术:有用但棘手