C ++ if语句数学评估错误

时间:2017-01-24 16:29:02

标签: c++

我有一个我认为是一个数学错误,我不完全理解它为什么会发生。

if (mNextBottomIndex < mBlocks.size() - 1) {
  if (mBlocks[mNextBottomIndex + 1]->getGlobalPosition().y >= -mBlocks[mNextBottomIndex + 1]->getHeight()) {
    mBlocks[mNextBottomIndex + 1]->setAlpha(1.0f);
    mNextBottomIndex++;
  }
}
由于inner if statementmBlocks.size() = 0(或mNextBottomIndex = 3等于任意数字&gt; 0),它对mNextBottomIndex的评估失败了。所以我的问题是,鉴于最后一句中的变量,它甚至超越了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++;
  }
}

现在似乎没有崩溃。

2 个答案:

答案 0 :(得分:9)

mBlocks.size()是一个unsigned int。 如果从值为0的无符号整数中减去1,它将下溢为一个大的正数。

答案 1 :(得分:2)

您还没有向我们展示mBlocks的类型,但考虑到您正在调用size() member function std::vector(或类似的stdlib容器;例如std::array }),返回类型的类型为size_type(来自std::vector::size @cppreference):

  

<强> std::vector::size

size_type size() const;

始终是无符号整数(来自std::vector @ cppreference):

  

会员类型

     

...

     

size_type无符号整数类型(通常为std::size_t

1中减去0时,您会在无符号类型中生成一个负数(在执行比较之前通过整数转换),(对于此负数-1小幅度)将包裹成一个大的无符号整数,它自然会将mNextBottomIndex < ...谓词作为true传递。

参见例如以下内容: