我有一个我认为是一个数学错误,我不完全理解它为什么会发生。
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
等于任意数字&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++;
}
}
现在似乎没有崩溃。
答案 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
传递。
参见例如以下内容: