我正在运行下面的代码示例,最初尝试向后打印一个字符数组,其中 count
表示数组中的字符数。每次我运行 for 循环时,i
都没有被初始化为 count - 1
而是被初始化为一个非常大的数字。但是在循环之外,我被正确初始化为 4。我无法解释为什么会这样。
size_t count {5};
size_t i {count - 1UL}; // i is initalized to 4
for(size_t i {count - 1}; i >= 0UL; --i) {
std::cout << i << std::endl;
} // infinite loop, i is initalized to 18446744073709141874
最佳答案
“无符号”整数没有符号且始终为非负数。如果您在 i = 0
上执行 --i
,那么您将获得 std::size_t
的最大值。
改为这样做:
// iterates from (count - 1) to 0
for (std::size_t i = count; i--;)
那么这是如何工作的呢? i--
是后缀自减运算符,返回i
的先验值。这样,循环条件实际上是将 count, ..., 1
与零进行比较,而在循环中我们得到 count - 1, ..., 0
。
这个成语的一个更通用的版本有时被称为 -->
operator :
// iterates from (high - 1) to low
for (std::size_t i = high; i-- > low;)
关于c++ - 使用 size_t 初始化循环变量时整数下溢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57935909/